如何使用指针的统一初始化?

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?

Sho*_*hoe 8

你不能把"直接"的临时地址......

您不能使用以下地址获取临时地址&:

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)

将工作正常(当然,假设构造函数不明确).