Как вы заметили, gcc действительно знает, что означает этот синтаксис, выдает конкретное сообщение об ошибке:
cannot convert ‘const X’ to ‘int’ in initialization
Это связано с тем, что фигурные скобки {}
запускают инициализацию списка и инициализацию списка для агрегатного типа (ваш struct X
является агрегатом, если вы не знаете почему, просто подумайте: «как массив, он просто содержит данные без какого-либо собственного поведения ") выполняет агрегатную инициализацию. Агрегатная инициализация означает, что инициализаторы сопоставляются с элементами данных по порядку, а любые дополнительные члены данных получают инициализированное значение.
x_.a
связан с x
x_.b
не связан ни с чем, поэтому значение инициализировано
Это не то, что вам нужно, потому что вы не можете вставить все x
в x_.a
(о чем вам говорит gcc). То, что вы действительно хотели, это прямая инициализация с использованием конструктора копирования, записанного как _x(x)
.
В Visual C++ история немного другая. Инженеры Microsoft все еще работают над добавлением поддержки C++11, и это одна из вещей, которую они еще не закончили (по крайней мере, в вашей версии). Компилятор знает, что когда он видит {}
в списке инициализаторов ctor, это означает инициализацию списка, но он не знает, как это сделать, поэтому сдается.
В частности, он не доходит до того, чтобы увидеть, что X
является агрегатом, соединить инициализаторы с элементами данных и выяснить, возможно ли спаривание x_.a
с x
.
Когда компилятор говорит вам, что "это не реализовано", это не означает, что код хороший, это не значит, что код плохой. Это означает, что для компиляции этого кода нужна логика, которая еще не выпущена (может быть, еще не написана, может быть еще не протестирована, никто за пределами Microsoft не знает). Ваш код был доставлен на завод, загружен на ленту конвейера, начал двигаться по сборочной линии и... упал с конца ленты, потому что машины, которая работает с таким кодом, еще нет на заводе. . Никто не знает, если бы машина была там, чтобы подобрать его, бросила бы он его в стопку ошибок или получила бы на другом конвейере.
person
Ben Voigt
schedule
25.10.2014
{}
и делаете это внутри списка инициализаторов членов. В сообщении об ошибке говорится, что это допустимо, но компилятор не готов позволить вам это сделать. Вместо этого попробуйтеx_(x)
в качестве обходного пути, это прямая инициализация, а не инициализация списка. - person Ben Voigt   schedule 26.10.2014{}
была бы законной, но она просто не реализована в этом компиляторе? - person Dan Nestor   schedule 26.10.2014struct X
является агрегатом, я бы использовал фигурные скобки{}
для инициализации агрегата (особая форма инициализации списка) и()
для построения копии, что у вас есть здесь. - person Ben Voigt   schedule 26.10.2014