Инициализация ссылки в структуре
struct A {
const int& x;
};
int foo() {
return 42;
}
A a(foo());
Программа компилируется gcc, но не компилируется clang https://godbolt.org/z/oaEerdxac. Кто прав и почему?
error: no matching constructor for initialization of 'A'
Ответы (1 шт):
В стандарте c++17 :
Для структур и объединений синтаксис предполагает использовать фигурные скобки. И называется это aggregate initialization (общая инициализация).
struct A {
const int& x;
const int& y;
};
A a = { 1 , 2 } ;
В круглых скобках это называется direct initialization (прямая инициализация). И она предполагает вызов конструктора. Но конструктор по-умолчанию определён только по-умолчанию, копирования и перемещения. По-элементного нет.
В стандарте c++20 разрешили использовать круглые скобки для общей инициализации. Но компилятор clang не успел добраться до этой тонкости, а gcc сделал.
Полный список initialization (видов инициализации).