я увидел следующие слова в стандартном проекте С ++ N4582:Когда пользовательские последовательности преобразований не рассматриваются для выбора жизнеспособных конструкторов в C++?
[over.best.ics/4] Однако, если целью является
(4,1) первый параметр конструктора или
(4.2) неявный параметр объекта из определенной пользователем функции преобразования
и конструктор или определяемые пользователем функции преобразования является кандидатом на
(4.3) 13.3.1.3, когда аргумент является временным во втором шаге класса копирования инициализации или
(4,4) 13.3.1.4, 13.3.1.5, 13.3.1.6 или (во всех случаев),
Определенные пользователем последовательности преобразований не учитываются.
Я смущен о смелой части и не знаю, как ее понять. Я пишу следующую программу:
#include <iostream>
using namespace std;
struct A {
A(int) {}
operator int() {cout << "user-defined conversion" << endl; return 0;}
A(A&) {} //prevent default copy
};
int main()
{
A a = A(0);
}
Это хорошо работает в г ++ 5.3.0, и выход «определенный пользователь преобразование», что означает, что определенный пользователь преобразование происходит. Разумеется, это можно интерпретировать как временное A (0) не является следствием копирование-инициализация. Затем я изменить программу:
#include <iostream>
using namespace std;
struct A {
A(int) {}
operator int() {cout << "user-defined conversion" << endl; return 0;}
A(A&) {} //prevent default copy
};
A foo() {return A(0);}
int main()
{
A a = foo();
}
Теперь значение Foo() является временной копия инициализируется из A (0), но программа все еще работает. Почему это произойдет?
Ваша котировка неверна; вы опустили 4.2 и перенумеровали с 4.3 до 4.2. – ecatmur
Вы понимаете, что означает «второй шаг»? –
@ecatmur Извините за эту неправильную цитату. – xskxzr