C++ 按引用传递匿名实例时出现意外编译错误

C++ 按引用传递匿名实例时出现意外编译错误,c++,C++,假设我有一个结构: struct structazauras { string bla; } 还有一些函数(在我的例子中,这个函数实际上是某个类的构造函数,但我认为这不是问题所在): 然后是我称之为myfunc的部分: .. myfunc(structazauras()); .. 我得到一个错误: no matching function for call to myfunc(structazauras) candidates are myfunc(structazauras&)

假设我有一个结构:

struct structazauras
{ 
string bla;
}
还有一些函数(在我的例子中,这个函数实际上是某个类的构造函数,但我认为这不是问题所在):

然后是我称之为myfunc的部分:

..
myfunc(structazauras());
..
我得到一个错误:

no matching function for call to myfunc(structazauras) candidates are myfunc(structazauras&)
如果我将代码更改为:

structazauras tmp;
myfunc(tmp);
它会很好用的


我觉得如果
structazuras
,他(编译器)在传递匿名实例的引用时会遇到问题,但为什么呢?匿名实例存在于调用函数的堆栈上。

这是因为无法将临时实例绑定到非常量引用。将您的引用标记为
const
,它将起作用

也可以在定义

中使用标准C++关键字(<代码>结构>代码)
void myfunc(structazauras& struct) { }
将名称更改为其他名称。或者你是说

void myfunc(struct structazauras&) { }

<>但是,在C++中,附加<代码> Stutt是多余的。

<代码> MyFunc(StangaTaLouSuy());<代码>需要一个
常量structazourous&
参数。为什么我不能将临时绑定到非常量引用?TMP实例与匿名实例的预期寿命有什么区别,它们都是在堆栈上生存的,不是吗?@ OopsUpl,我想C++标准不想保持活着的临时对象,同时允许您进一步修改它们。不完全确定这是否是原因,但这有一定的道理。@OopsUser:为了避免混淆,例如,当您希望引用修改现有变量时,如果类型转换导致引用绑定到临时变量。有关完整详细信息,请参阅DUP。
void myfunc(struct structazauras&) { }