【发布时间】:2018-07-29 22:43:33
【问题描述】:
#include<cstddef>
template<typename T, std::size_t N>
struct A {
T m_a[N];
A() : m_a{} {}
};
struct S {
explicit S(int i=4) {}
};
int main() {
A<S, 3> an;
}
上面的代码在 MSVC (2017) 下编译得很好,但在 clang 3.8.0 中编译失败(clang++ --version && clang++ -std=c++14 -Wall -pedantic main.cpp 的输出):
clang version 3.8.0 (tags/RELEASE_380/final 263969)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
main.cpp:6:15: error: chosen constructor is explicit in copy-initialization
A() : m_a{} {}
^
main.cpp:14:13: note: in instantiation of member function 'A<S, 3>::A' requested here
A<S, 3> an;
^
main.cpp:10:14: note: constructor declared here
explicit S(int i=4) {}
^
main.cpp:6:15: note: in implicit initialization of array element 0 with omitted initializer
A() : m_a{} {}
^
1 error generated.
clang 5.0 也拒绝编译这个:
<source>:6:17: error: expected member name or ';' after declaration specifiers
A() : m_a{} {}
^
<source>:6:14: error: expected '('
A() : m_a{} {}
^
2 errors generated.
如果我在As 构造函数中使用简单的括号(即A() : m_a() {}),它编译得很好。从cppreference 我会怀疑两者都应该导致相同的结果(即值初始化)。我是否遗漏了什么或者这是其中一个编译器中的错误?
【问题讨论】:
-
Clang 3.8.0 相当老了。您是否尝试过使用现代 clang(如 5.0.1)?
-
@JesperJuhl 它不能在 clang 主干上编译 :(
标签: c++ visual-studio initialization clang language-lawyer