Возврат анонимного экземпляра / значения в функции в переполнении стека

У меня есть вопросы по поводу возвращаемого типа функции в 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

0

Решение

так как return int 1 не работает

Но return int(1); делает … или return 3 - 2; в этом отношении. Нет ничего плохого в создании временного или использования литерала — тогда конструктор копирования или перемещения класса будет затем использоваться, если необходимо, для установки переменной в контексте вызывающего, или иногда будет возвращаться оптимизация возвращаемого значения (RVO), и вызываемая функция будет быть в состоянии создать возвращаемое значение непосредственно в стеке вызывающего.

3

Другие решения