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