标准 C++ 类型(例如 int 或 char)具有构造函数,因此您可以使用如下表达式:
int a = int(67); // create anonymous variable and assing it to variable a
int b(13); // initialize variable b
int(77); // create anonymous variable
用户定义的类型(结构或类)能够执行相同的操作:
struct STRUCT
{
STRUCT(int a){}
};
STRUCT c = STRUCT(67);
STRUCT d(13);
STRUCT(77);
问题是:为什么我们可以传递引用匿名结构或类实例,但不能传递标准类型?
struct STRUCT
{
STRUCT(int a){}
};
void func1(int& i){}
void func2(STRUCT& s){}
void func3(int i){}
void func4(STRUCT s){}
void main()
{
//func1(int(56)); // ERROR: C2664
func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference
func3(int(46)); // OK: anonymous int is created then assigned to a parameter
func4(STRUCT(12)); // OK: anonymous object is created then assigned to a parameter
}
如果您的编译器允许这样做,那么它就不是标准兼容的 C++ 编译器。您不能将临时右值绑定到非常量左值引用。这是规则。两个都clang http://coliru.stacked-crooked.com/a/acfdf47d2edf574f and gcc http://coliru.stacked-crooked.com/a/73db08a665558e1b不要编译该代码func2(STRUCT(65));
.
相反,你有其他选择:
void func1(int&& i){}
void func1(const int& i){}
C++03 的遗留问题:对非常量类型的(左值)引用 (int &i
)应该能够更改参数,然后传递一个临时对象,例如56
不合逻辑,因为它不可改变。对 const 类型的引用 (const int &i
)应该只是将该值观察为只读,然后传递一个临时值,例如52
是合法的。
在 C++11 中,您可以通过以下方式引用非常量临时对象:&&
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)