- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
另一个“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/
#include template> struct index_sequence_of_same_value; template struct index_sequence_of_same_valu
我想创建一个接受以下输入的类: 1,make_tuple('A',2,'B') 在类内部有一个静态类型的元组: std::tuple 和内容: {1,'A',2,'B'} 应该创建。 有点像这样——但
模板参数推导允许以下内容还是未推导的上下文? #include #include template auto make(std::index_sequence = std::make_index_s
我的源代码中有这段代码: template class DimensionPack { public: using Dimensions = std::index_sequence;
所以我偶然发现了这段代码,但我不明白为什么下面的代码构造并非格式错误。 template struct mystruct : std::index_sequence { T i; }; int m
在下面的代码中: #include #include #include template void f(Args... args) { std::cout void g (std::
我是 C++14 std::index_sequence 的新手。结构的 size 成员是什么意思?无论我创建了多少元素,它总是返回一个。 std::integer_sequence::size =
我正在尝试将 index_sequence 分成两半。为此,我生成了一个包含下半部分的 index_sequence,并使用它来跳过完整 index_sequence 中的前导元素。以下是代表我要实现
我想计算 exclusive prefix sum (scan) std::index_sequence 的索引,但我不确定从哪里开始。我调查了 std::make_index_sequence 的实
我很难理解以下内容。为什么这段代码可以编译 template auto foo2(std::index_sequence = std::make_index_sequence()) { co
我有一个 std::tuple,我想使用 std::index_sequence 解包内容以调用可变函数模板 考虑以下示例代码: #include #include template void f
我正在尝试使用 std::integer_sequence及其辅助模板 std::index_sequence初始化一个固定大小的 POD 结构,其行为类似于容器。每个元素又包含一个固定大小的数组字段
我很喜欢使用可变参数模板,并开始尝试使用这个新功能。我试图了解 std::index_sequence 的实现细节(用于元组实现)。我在那里看到了示例代码,但我真的想要一个简单的逐步解释 std::i
我有一个函数模板: template void set_args(const void* p, Us&... args); 我有一个 std::tuple,我想将其解压到 args 中。我目前的解决
我需要用采用相同构造函数参数的 N 个对象初始化一个 std:array,如 std::vector(size_t, {args...}) .从我在这里的搜索中,我想出了这个,它有效: templat
另一个“g++ 和 clang++ 之间谁是正确的?” C++ 标准专家的问题。 给定以下代码 #include template > struct foo; template struct fo
我是一名优秀的程序员,十分优秀!