以下代码合法吗?
template <int N>
class foo {
public:
constexpr foo()
{
for (int i = 0; i < N; ++i) {
v_[i] = i;
}
}
private:
int v_[N];
};
constexpr foo<5> bar;
Clang接受它,但是GCC和MSVC拒绝它。
GCC的错误是:
main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = 5]' called in a constant expression
15 | constexpr foo<5> bar;
| ^~~
main.cpp:4:15: note: 'constexpr foo<N>::foo() [with int N = 5]' is not usable as a 'constexpr' function because:
4 | constexpr foo()
| ^~~
main.cpp:4:15: error: member 'foo<5>::v_' must be initialized by mem-initializer in 'constexpr' constructor
main.cpp:12:9: note: declared here
12 | int v_[N];
| ^~
如果这种代码可以,我可以减少使用index_sequence
s的次数。
1
Gcc10也接受它。
—
songyuanyao
您可以记录来自MSVC的错误吗?
—
max66
...以及GCC。
—
EVG
@songyuanyao-g ++ 10接受它编译C ++ 20; 拒绝编译C ++ 17或更早版本;这一点似乎
—
max66
_v
应该在初始化列表中进行初始化,直到C ++ 17。也许在C ++ 20中有所改变。
@Evg这实际上很有趣,因为它可能表明Clang使用其“意识”将静态存储持续时间对象清零以表示“好的,该对象可能已被默认初始化,但从其
—
反过来
int
成员读取的内容永远不会有未定义的行为” ”。我想知道GCC是否不遵守该规定,或者