c++ - 在 C++ 11 中将指针传递给临时变量?

标签 c++ c++11 c++14 c++17 temporary-objects

我有一个现有的功能:

void foo(const Key* key = nullptr)
{
  // uses the key
}

我想将它的指针传递给临时 Key 对象(即右值),例如:

foo(&Key());

这会导致编译错误,但在 C++ 11/14 中有什么方法可以做到这一点吗?我当然可以:

Key key;
foo(&key);

但是我不需要object Key,我只需要在foo()和foo()里面

或者我可以这样做:

foo(new Key());

但是对象不会被删除。

最佳答案

我不认为这是个好主意,但如果你真的想要一个临时文件并且不能更改 foo,你可以将临时文件转换为 const&:

int main()
{
    foo(&static_cast<const Key&>(Key{}));
}

live example on wandbox


或者,您可以将对象的创建“隐藏”在一个方便的函数后面:

template <typename T, typename F, typename... Ts>
void invoke_with_temporary(F&& f, Ts&&... xs)
{
    T obj{std::forward<Ts>(xs)...};
    f(&obj);
}

int main()
{
    invoke_with_temporary<Key>(&foo);
}

live example on wandbox.org


另一种选择:提供采用引用的 foo 重载:

void foo(Key&& key)
{
    foo(&key);
}

关于c++ - 在 C++ 11 中将指针传递给临时变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458206/

相关文章:

c++ - std::transform 的泛化

c++ - 为什么在用花括号初始化结构时会出错?

C++11 私有(private)默认构造函数

c++ - 安置新的返回值

c++ - 检测单个枚举常量的类型

C++ 忽略空的第一行

c++ - 为什么正则表达式 "//"和 "/*"不能匹配单条注释和 block 注释?

C++ 模板特化 : change return type of operator()?

c++ - 如何在取消引用(C++)之前检查迭代器?

c++ - 我可以在带有值初始化的 header 中使用 static const float