显然,根据 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/