После кода отлично работает (показывая РВО):Какое влияние ключевое слово «явное» на Оптимизацию возвращаемого значения (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’
Почему это происходит, разве RVO не работает так, как есть?
Это не имеет никакого отношения к RVO. –
Похоже, что на это отвечает: http://stackoverflow.com/questions/29472565/explicit-copy-constructor-compile-error – NathanOliver
@ KonradRudolph, но без ключевого слова «явно» RVO имеет место и не делает несколько копий 'A'. Почему это не должно продолжаться, когда мы отмечаем конструктор как «явный»? Возможно, Q не имеет прямого отношения к RVO, но я обнаружил некоторую косвенную связь между этими двумя вещами. @NathanOliver, спасибо за указание. Это Q показывает наблюдение. Однако это Q о «Почему?» – iammilind