Ваш пример можно сократить до
class A {
public:
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
int main()
{
A a{};
A const& ar1(a);
A const& ar2{a}; // fails on gcc 4.8
}
Инициализация ar2
не выполняется на gcc-4.8 с ошибкой
error: use of deleted function ‘A::A(const A&)’
Он чисто компилируется на clang3.4 и gcc4.9. Это результат решения CWG по проблеме 1288.
N3337 содержит следующий язык для инициализации списка:
§8.5.4/3 [dcl.init.list]
Инициализация списка объекта или ссылки типа T
определяется следующим образом:
— ...
— В противном случае, если T
является ссылочным типом, временное значение prvalue типа, на которое ссылается T
, инициализируется списком, и ссылка привязана к этому временному
Это, конечно, означает, что для инициализации ar2
требуется доступный конструктор-копия, отсюда и ошибка.
Язык изменился в N3797, где инициализация из списка инициализаторов, содержащего один элемент, имеет приоритет над случаем, указанным выше.
— В противном случае, если в списке инициализаторов есть один элемент типа E
и либо T
не является ссылочным типом, либо его ссылочный тип связан со ссылкой на E
, объект или ссылка инициализируется из этого элемента; ...
— В противном случае, если T
является ссылочным типом, временное значение prvalue типа, на которое ссылается T
, инициализируется списком копирования или инициализируется прямым списком, в зависимости от типа инициализации ссылки и ссылки. привязан к этому временному.
Таким образом, gcc 4.9 и clang 3.4 реализуют решение проблемы 1288, а gcc 4.8 следует формулировке стандарта C++11.
person
Praetorian
schedule
17.07.2014
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
, поэтому и поставил 5.1, но не был уверен. - person smancill   schedule 17.07.2014: a{a} {
) - person chris   schedule 17.07.2014a(a)
; форма{ }
требует временного - person M.M   schedule 17.07.2014B
, более простой пример:A const &z {a};
- person M.M   schedule 17.07.2014A
, но тогда то же самое, что иint i{5};
. Хотя я вижу, к чему ты клонишь. Даже при инициализации списка это все еще список инициализаторов. - person chris   schedule 17.07.2014{
...}
называется списком инициализаторов, даже если не требуется создаватьstd::initializer_list
- person M.M   schedule 17.07.2014