-1

次の例を検討してください。

#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 ‘&lt;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 ‘&lt;brace-enclosed initializer list>’ to ‘std::array<A<int>, 1ul>&&’

ただし、変数を定義するときは、同じブレースの初期化が機能します。

std::array<B, 1> b{{B()}};

この特定のバージョンの gcc が C++11 を完全に実装していないためですか、それとも何か不足していて最初の例が正しくないためですか?

4

1 に答える 1

1

この特定のバージョンの gcc が C++11 を完全に実装していないためですか?

おそらくそうです。GCC 4.6 はかなり時代遅れです。

または、何かが欠けていて、最初の例が正しくありませんか?

C ++ 11構文に関しては、あなたの例は問題ありません。エラーや警告なしでcolliruでコンパイルされます。

于 2016-12-26T18:51:53.240 に答える