У меня есть вопросы по поводу возвращаемого типа функции в C ++.
Зачем return pair<int, int>(1, 1);
а также return vector<int>(3, 3);
Работа? Разве я не должен создавать локальный экземпляр var перед рукой и принимать его как возвращаемое значение, так же, как и возврат a, потому что return int 1;
не работает
// ...
int fun1() {
// return int 1;
int a = 1;
return a;
}
pair<int, int> fun2() {
return pair<int, int>(1, 1);
}
vector<int> fun3() {
return vector<int>(3, 3);
}
int main(){
cout << fun1() << endl;
cout << fun2().first << endl;
cout << fun3()[1] << endl;
return 0;
}
Разве такой стиль для возврата можно применять только к экземплярам классов с определенным конструктором? Пример ниже может работать.
Я ищу подтверждение или справочные материалы.
class A {
public:
int a;
A(int a_) : a(a_) {};
};
A fun4() {
return A(1);
}
Пример кода проверен в:
Apple LLVM версии 6.0 (clang-600.0.56) (на основе LLVM 3.5svn)
Цель: x86_64-apple-darwin14.0.0
Модель потока: posix
так как
return int 1
не работает
Но return int(1);
делает … или return 3 - 2;
в этом отношении. Нет ничего плохого в создании временного или использования литерала — тогда конструктор копирования или перемещения класса будет затем использоваться, если необходимо, для установки переменной в контексте вызывающего, или иногда будет возвращаться оптимизация возвращаемого значения (RVO), и вызываемая функция будет быть в состоянии создать возвращаемое значение непосредственно в стеке вызывающего.