考虑以下示例:
#include <array>
template <typename T>
struct A {
A() {}
};
typedef A<int> B;
struct S {
std::array<B, 1> b;
S() : b{{B()}} {}
};
int main() {
S s;
}
当试图用 g++ 4.6.3 编译它时,-std=c++0x
我得到了这个错误:
test.cc: In constructor ‘S::S()’:
test.cc:13:16: error: no matching function for call to ‘std::array<A<int>, 1ul>::array(<brace-enclosed initializer list>)’
test.cc:13:16: note: candidates are:
/usr/include/c++/4.6/array:60:12: note: std::array<A<int>, 1ul>::array()
/usr/include/c++/4.6/array:60:12: note: candidate expects 0 arguments, 1 provided
/usr/include/c++/4.6/array:60:12: note: constexpr std::array<A<int>, 1ul>::array(const std::array<A<int>, 1ul>&)
/usr/include/c++/4.6/array:60:12: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const std::array<A<int>, 1ul>&’
/usr/include/c++/4.6/array:60:12: note: constexpr std::array<A<int>, 1ul>::array(std::array<A<int>, 1ul>&&)
/usr/include/c++/4.6/array:60:12: note: no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘std::array<A<int>, 1ul>&&’
但是,在定义变量时,同样的大括号初始化工作:
std::array<B, 1> b{{B()}};
是因为这个特定版本的 gcc 没有完全实现 C++11 还是我遗漏了一些东西并且第一个示例不正确?