Следующий код работает отлично (показывая RVO):
struct A {
A (int) { cout << "A::A()\n"; } // constructor
A (const A&) { cout << "A::A(const A&)\n"; } // copy constructor
};
A foo () { return A(0); }
int main () {
A a = foo();
}
Выход:
A::A() // --> which means copy constructor is not called
Если я отмечу конструктор копирования как explicit
:
explicit A (const A&) { ... }
Затем компилятор выдает ошибку:
explicit.cpp: In function ‘A foo()’:
explicit.cpp:10:22: error: no matching function for call to ‘A::A(A)’
A foo () { return A(0); }
^
explicit.cpp:5:3: note: candidate: A::A(int)
A (int) { cout << "A::A()\n"; }
^
explicit.cpp:5:3: note: no known conversion for argument 1 from ‘A’ to ‘int’
explicit.cpp: In function ‘int main()’:
explicit.cpp:14:13: error: no matching function for call to ‘A::A(A)’
A a = foo();
^
explicit.cpp:5:3: note: candidate: A::A(int)
A (int) { cout << "A::A()\n"; }
^
explicit.cpp:5:3: note: no known conversion for argument 1 from ‘A’ to ‘int’
Почему это происходит? Разве РВО не должен работать так, как есть?
explicit
происходит RVO, а не делается несколько копийA
. Почему то же самое не должно продолжаться, когда мы помечаем конструктор какexplicit
? Q может не иметь прямого отношения к RVO, но я обнаружил некоторую косвенную связь между этими двумя вещами. @NathanOliver, спасибо, что указали. Этот Q показывает наблюдение. Однако этот вопрос о том, почему? - person iammilind   schedule 02.08.2016