#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.
Если я использую простые круглые скобки в конструкторе A
(т.е. A(): m_a() {}
), он компилируется отлично. Из cppreference я бы предположил, что оба они должны привести к тому же (т.е. инициализации значения). Я что-то упустил или это ошибка в одном из компиляторов?