O C ++ 11 padrão garante que o objeto temporário passado para uma função tenha sido criado antes da chamada da função?
O padrão C ++ 11 garante que todos os 3 objetos temporários foram criados antes do início da execução da função?
Mesmo se o objeto temporário passou como:
objetorvalue-referencepassou apenas membro do objeto temporário#include <iostream>
using namespace std;
struct T {
T() { std::cout << "T created \n"; }
int val = 0;
~T() { std::cout << "T destroyed \n"; }
};
void function(T t_obj, T &&t, int &&val) {
std::cout << "func-start \n";
std::cout << t_obj.val << ", " << t.val << ", " << val << std::endl;
std::cout << "func-end \n";
}
int main() {
function(T(), T(), T().val);
return 0;
}
Resultado:
T created
T created
T created
func-start
0, 0, 0
func-end
T destroyed
T destroyed
T destroyed
Rascunho de trabalho, padrão para a linguagem de programação C ++ 12/07/2016:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf
§ 5.2.2 Chamada de função
§ 5.2.2
1 Uma chamada de função é uma expressão postfix seguida por parênteses que contêm uma lista possivelmente vazia, separada por vírgulas, de cláusulas de inicializador que constituem os argumentos para a função.
Mas pode ser qualquer umT criado depois defunc-start?
Ou existe alguma maneira de passar argumentos como valor de g / r / l / x / pr para que a função inicie antes da criação do objeto temporário?