use*_*020 3 c++ initialization
例如,我有一个班级
struct A
{
A(int i, double d) {...}
};
Run Code Online (Sandbox Code Playgroud)
和带参数A的函数
void f(A a);
Run Code Online (Sandbox Code Playgroud)
我可以通过调用函数
f( { 1, 3.14 } );
Run Code Online (Sandbox Code Playgroud)
如果函数有参数A*
void g(A* a);
Run Code Online (Sandbox Code Playgroud)
怎么叫它像
g( my_new{1, 3.14} ); // Note: no type A is shown here.
Run Code Online (Sandbox Code Playgroud)
或者如何在这里推导出类型A?
您不能使用以下地址获取临时地址&:
g(&({1, 3.14}));
Run Code Online (Sandbox Code Playgroud)
按照:
§5.3.1/ 3
一元&运算符的结果是指向其操作数的指针.操作数应为左值或限定ID.
(强调我的)
例如,您可以使用函数来提取指向临时对象的指针:
A* fn(A&& a) {
return std::addressof(a);
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
g(fn({1, 4.0}));
Run Code Online (Sandbox Code Playgroud)
请注意,这std::addressof是避免operator&类可能出现过载所必需的A.您也可以通过类的成员函数A以及许多其他方式来提取它.
为什么突然的意见改变了?好吧,我已经与其他C++仇恨者讨论过了,显然这是可能的,完全合法的.
我建议g改为const参考:
void g(const A& a);
Run Code Online (Sandbox Code Playgroud)
然后:
g({1, 3.14});
Run Code Online (Sandbox Code Playgroud)
将工作正常(当然,假设构造函数不明确).