Зачем мне нужен составной литерал, такой как временная конструкция, для инициализации моего члена std :: array?

Рассмотрим этот минимальный пример:

#include <array>
struct X {
std::array<int,2> a;
X(int i, int j) : a(std::array<int,2>{{i,j}}) {}
//                 ^^^^^^^^^^^^^^^^^^       ^
};

В соответствии с другие посты Я не должен был явно создавать временные в этой ситуации. Я должен быть в состоянии написать:

  X(int i, int j) : a{{i,j}} {}

но эта и несколько других (похожих) версий, которые я пробовал, все отклонены моей (по общему признанию, довольно старой) g ++ 4.5.2. В настоящее время у меня есть только один для экспериментов. Это говорит:

error: could not convert ‘{{i, j}}’ to ‘std::array<int, 2ul>’

Это ограничение реализации компилятора или что происходит?

0

Решение

Проблема, как правило, в версии компилятора. Следующий код прекрасно работает с GCC 4.7.1:

#include <array>

struct X{
std::array<int, 2> a;
X() : a{{1,2}} {}
};

int main(){
X x;
}

Живой пример.

6

Другие решения

Других решений пока нет …