Oto przykład kodu z C++ quizu:Dlaczego wywoływany jest konstruktor ruchu?
#include <iostream>
struct X {
X(const char *) { std::cout << 1; }
X(const X &) { std::cout << 2; }
X(X &&) { std::cout << 3; }
};
X f(X a) {
return a;
}
X g(const char * b) {
X c(b);
return c;
}
int main() {
f("hello");
g("hello");
}
Jaki będzie wyjście z programu?
myślę w ten sposób:
f(X a)
nazywa, a konstruktor niejawnie konwertujeconst char*
X, więc wyjście jest 1- Ponieważ nie mamy obiekt do przechowywania powrót wartość, wartość powrotna jest odrzucane ma wyjścia
g(const char*)
nazywa iX c(b)
X(const char*)
wyjście jest 1- Wartością zwracaną jest jeszcze raz odrzucone - ma wyjścia
Więc odpowiedź brzmi 11. Odpowiedź który został podany do quizu jest 131. odpowiedź, która mi się z g ++ 4.4. 4-13 jest 121.
mówi się, że ten kod został skompilowany z tym poleceniem:
g++ -std=c++11 -Wall -Wextra -O -pthread
Skąd numer środkowy pochodzi? I dlaczego może być 3 lub 2?
Kopiowanie elision (http://en.cppreference.com/w/cpp/language/copy_elision) nie jest obowiązkowe. Nie możesz polegać na tej optymalizacji. Tak więc w instrukcjach return nic nie można polegać. – Lingxi
Kto napisał to jako "quiz"? Ten program może poprawnie wydrukować cztery różne wyjścia. –
@ T.C. Jest to coś, co nazywa się quiz pubem C++ na ACCU 2014 rok – DoctorMoisha