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

问题描述 投票:0回答:1

很明显,根据 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
。不过,我仍然希望能够将临时变量传递给它。

c++ language-lawyer undefined-behavior lifetime
1个回答
1
投票

这是一个结构良好的程序。我说得对吗?

确实结构很好。

标准库中已经有这样的助手了吗?

它会是

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

© www.soinside.com 2019 - 2024. All rights reserved.