Инициализация ссылки в структуре

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 шт):

Автор решения: AlexGlebe

В стандарте c++17 :

Для структур и объединений синтаксис предполагает использовать фигурные скобки. И называется это aggregate initialization (общая инициализация).

struct A {
  const int& x;
  const int& y;
};

A a = { 1 , 2 } ;

В круглых скобках это называется direct initialization (прямая инициализация). И она предполагает вызов конструктора. Но конструктор по-умолчанию определён только по-умолчанию, копирования и перемещения. По-элементного нет.

В стандарте c++20 разрешили использовать круглые скобки для общей инициализации. Но компилятор clang не успел добраться до этой тонкости, а gcc сделал.

Полный список initialization (видов инициализации).

→ Ссылка