gpt4 book ai didi

c++ - g++ 和 clang++ 在 `std::make_index_sequence` 和 `std::index_sequence` 用于模板参数默认类型时的不同行为

转载 作者:可可西里 更新时间:2023-11-01 17:59:52 30 4
gpt4 key购买 nike

另一个“g++ 和 clang++ 之间谁是正确的?” C++ 标准专家的问题。

给定以下代码

#include <utility>

template <std::size_t N, typename = std::make_index_sequence<N>>
struct foo;

template <std::size_t N, std::size_t ... Is>
struct foo<N, std::index_sequence<Is...>>
{ };

template <std::size_t N>
void bar (foo<N> const &)
{ }

int main()
{
bar(foo<42u>{});
}

我看到 g++ 编译时 clang++ 给出了以下错误

tmp_003-14,gcc,clang.cpp:32:4: error: no matching function for call to 'bar'
bar(foo<42u>{});
^~~
tmp_003-14,gcc,clang.cpp:27:6: note: candidate template ignored: could not match
'__make_integer_seq' against 'integer_sequence'
void bar (foo<N> const &)
^
1 error generated.

像往常一样,问题是:谁是对的? g++ 还是 clang++?

-- 编辑 -- 正如 HolyBlackCat 所指出的(谢谢!),一些旧版本的 clang++ 会编译这段代码,而新版本则不会。

我试过 Wandbox,我看到 clang++ 从 3.4(第一个支持 std::make_index_sequence/std::index_sequence 的版本)编译到 3.8.1 .从3.9.1开始出现上述错误。

-- 编辑 2 -- 观察到 clang++ 编译错误似乎严格限制在第二个默认值的定义中使用第一个模板参数。

事实上,改变

template <std::size_t N, typename = std::make_index_sequence<N>>
struct foo;

// ........................... now doesn't depends from N -->VVV
template <std::size_t N, typename = std::make_index_sequence<10u>>
struct foo;

两个编译器都能编译。

最佳答案

这显然是某种 Clang/libc++ 错误:类型 std::make_index_sequence<…>不是__make_integer_seq ,它是……std::index_sequence<…> .类型别名(和别名模板)是透明的,推导一直适用于 std::vector尽管它有默认的(分配器)模板参数。

关于c++ - g++ 和 clang++ 在 `std::make_index_sequence` 和 `std::index_sequence` 用于模板参数默认类型时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133186/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com