c++ - 通过 const 指针而不是 const 引用传递临时值;这个解决方法格式正确吗?

标签 c++ language-lawyer undefined-behavior lifetime

显然,根据 C++ 标准,不能将 const 指针传递给临时变量作为函数的参数,而传递 const 引用则完全没问题,尽管两者本质上是相同的。

这很令人费解,到目前为止我得到的唯一解释是,C++ 不能足够微妙地允许获取临时地址,只要所述地址不比表达式存在得更久。不过,我们可以欺骗它允许这样做。我的问题是,它仍然是一个格式良好的程序吗?

代码如下:

#include <string>
#include <iostream>

std::string const * constRefToPtr( std::string const & v )
{
  return &v;
}

void takeStringPtr( std::string const * s )
{
  std::cout << *s << std::endl;
}

int main()
{
  // This one isn't allowed by the standard
  // takeStringPtr( &std::string( "Hello, world" ) );

  // However, this is just fine, apparently. Is this a well-formed program though?
  takeStringPtr( constRefToPtr( std::string( "Hello, world" ) ) );

  return 0;
}

如您所见,我们引入了一个帮助器来将 const 引用转换为 const 指针。据我所知,由于临时变量应该一直存在到表达式末尾,所以这是一个格式良好的程序。我说得对吗?

如果是的话,标准库中已经有这样的助手了吗?

附注如果您想知道为什么我首先需要这个,我有一个函数,它接受 const 指针而不是 const 引用,因为它允许传递 nullptr。不过,我仍然希望能够将临时变量传递给它。

最佳答案

this is a well-formed program. Am I right?

它的结构确实很好。

is there such a helper in the standard library already?

这将是 std::addressof ,但临时(右值)的重载被故意删除(具有与 &temporary() 类似的限制)。

关于c++ - 通过 const 指针而不是 const 引用传递临时值;这个解决方法格式正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77419982/

相关文章:

c++ - 有符号整数溢出、内在函数和未定义行为

c++ - 运算符 "<<"重载返回类型

c++ - 非静态数据成员的cppreference定义是否错误?

c++ - 非 constexpr 可构造类的 constexpr 成员函数

c++ - char 初始化枚举的基础类型应该是什么?

c - 二维结构 C 数组的未定义行为

c++ - AVStream.duration 的值错误

c++ - 在 C++ 中查找用户输入的最小值

c++ - 实现插件支持的最佳方式

c - 通用字符缓冲区用作具有灵活数组成员的结构数组