当我使用编译以下代码时 g++
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
Run Code Online (Sandbox Code Playgroud)
经过一番反思,这些错误对我来说很有意义.A()只是一个临时值,而不是堆栈中的可分配位置,因此它似乎没有地址.如果它没有地址,那么我就不能对它进行引用.好的.
可是等等!如果我将以下转换运算符添加到类中A
class A
{
public:
operator A&() { return *this; }
};
Run Code Online (Sandbox Code Playgroud)
一切都很好!我的问题是这是否远程安全.什么时候this指向何时A()构建为临时值?
事实上,我对此充满信心
void foo(const A&) {}
Run Code Online (Sandbox Code Playgroud)
可以根据g++我使用过的所有其他编译器接受临时值.该 …
根据代码受到影响的作者,我有一个大型的跨部门提交,我希望将其分开,以提高审阅者对他们正在审查的代码的熟悉程度,并公平地划分审阅负担.
我意识到责任可能会混合在一个特定的大块中,在这种情况下,收集多个评论者或者只选择最"应受谴责"的评论会很好(打破任意关系很好).
我知道__stdcall函数不能有省略号,但我想确保没有支持stdarg.h函数的平台来调用除__cdecl或__stdcall之外的约定.