Iva*_*ars 6 c++ anonymous pass-by-reference
标准C++类型(如int或char)具有ctors,因此您可以使用以下表达式:
int a = int(67); // create anonymous variable and assing it to variable a
int b(13); // initialize variable b
int(77); // create anonymous variable
Run Code Online (Sandbox Code Playgroud)
用户定义的类型(结构或类)能够做同样的事情:
struct STRUCT
{
STRUCT(int a){}
};
STRUCT c = STRUCT(67);
STRUCT d(13);
STRUCT(77);
Run Code Online (Sandbox Code Playgroud)
问题是:为什么我们可以通过引用匿名结构或类实例传递,但不能传递标准类型?
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
}
Run Code Online (Sandbox Code Playgroud)
如果您的编译器允许这样做,那么它就不是标准兼容的 C++ 编译器。您不能将临时右值绑定到非常量左值引用。这是规矩。无论铛和GCC不编译代码func2(STRUCT(65));。
相反,您有其他选择:
void func1(int&& i){}
void func1(const int& i){}
Run Code Online (Sandbox Code Playgroud)
来自 C++03 的遗产:对非常量类型 ( int &i) 的(左值)引用应该能够更改参数,然后传递诸如56不合逻辑的临时对象,因为它不可更改。对 const 类型 ( const int &i) 的引用应该只是将值观察为只读,然后传递诸如52合法的临时值。
在 C++11 中,您可以通过&&.
您似乎正在使用具有此类错误的MS VC++编译器.:)您必须使用const引用绑定临时对象.例如,你可以写
const int &ri = 10;
Run Code Online (Sandbox Code Playgroud)
但你可能不会写
int &ri = 10;
Run Code Online (Sandbox Code Playgroud)
这同样适用于用户定义的类型.
const STRUCT &rs = STRUCT( 10 );
STRUCT &rs = STRUCT( 10 ); // the compiler shall issue an error.
Run Code Online (Sandbox Code Playgroud)