如何为指针使用统一初始化

How to use uniform initialization for a pointer?

本文关键字:初始化 指针      更新时间:2023-10-16

例如,我有一个类

struct A
{
    A(int i, double d) {...}
};

和带参数a的函数

void f(A a);
我可以通过 调用函数
f( { 1, 3.14 } );

如果函数有参数A*

void g(A* a);

如何使它像

那样调用
g( my_new{1, 3.14} ); // Note: no type A is shown here.

或者如何导出A类型?

不能直接获取临时的地址…

不能使用&:

获取临时地址
g(&({1, 3.14})); 
按:

§5.3.1/3

一元&Operator是指向其操作数的指针。操作数必须为左值或限定id。

(强调我的)

…但是你可以间接地做到!

例如,可以使用一个函数来提取指向临时对象的指针:

A* fn(A&& a) {
    return std::addressof(a);
}

,并将其用作:

g(fn({1, 4.0}));

注意std::addressof是必要的,以避免A类可能的operator&过载。您也可以通过类A的成员函数或许多其他方法提取它。

为什么突然改变意见?嗯,我已经和其他讨厌c++的人讨论过了,显然这是可能的,而且完全合法的。

我的建议

我建议g参考const:

void g(const A& a);

然后:

g({1, 3.14});

可以正常工作(当然,假设构造函数不是显式的)。