2012-09-06 5 views
0

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

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

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

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

но и несколько других (подобных) версии я попробовал все отказались от меня (правда, довольно старая) г ++ 4.5.2. У меня в настоящее время есть только один для экспериментов. Он говорит:

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

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

+2

Это не соединение буквальным; У C++ их даже нет! –

+4

Да, ваш устаревший GCC - проблема - [отлично работает с 4.7.1] (http://liveworkspace.org/code/af413b3d9b062ea32cd3dd7b3e3aff33). – ildjarn

+0

Я предположил, что он говорит о многохарактерных литералах, но в этом вопросе тоже нет. –

ответ

6

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

#include <array> 

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

int main(){ 
    X x; 
} 

Live example.

+0

Это ответили на комментарии ildjam. –

+5

@MattPhillips: Хорошо, и потому, что я написал свой ответ в то же самое время, я получаю нисходящий знак? Извините, что я немного медленнее с набрав. Кроме того, на вопрос нужно ответить, а не просто комментарий. – Xeo

+0

Просто добрался до вашего комментария, извините, что Xeo. Я должен был посмотреть на отметки времени, и теперь мой нисходящий канал заблокирован. FWIW Я сделал это вам в другом месте. :) –