C++ 指针引用的默认值

C++ 指针引用的默认值,c++,pointers,C++,Pointers,我需要将函数中的最后一个参数设置为默认参数,该参数的类型为*&(对指针的引用)。出于某种原因,这对我不起作用: template<class T> void f(T*& = nullptr); 模板 无效f(T*&=nullptr); 我得到一个错误: 错误1错误C2440:“默认参数”:无法从“nullptr”转换为“T*&” 如何解决这个问题?这里有一个指向指针的l值引用,因此需要将其默认为l值。由于l值不能是nullptr(它是一个r值),因此您需要更改函数以获

我需要将函数中的最后一个参数设置为默认参数,该参数的类型为
*&
(对指针的引用)。出于某种原因,这对我不起作用:

template<class T>
void f(T*& = nullptr);  
模板
无效f(T*&=nullptr);
我得到一个错误:

错误1错误C2440:“默认参数”:无法从“
nullptr
”转换为“
T*&


如何解决这个问题?

这里有一个指向指针的l值引用,因此需要将其默认为l值。由于l值不能是
nullptr
(它是一个r值),因此您需要更改函数以获取r值:

template <typename T>
void f(T const* const& = nullptr)

但是我无法想象有什么理由你真的希望l值默认为这个值。

基本上,如果你需要用
nullptr
调用这个函数(这意味着“我没有要传递给函数的值,但无论如何都要调用它”),那么你应该按照
t**
取参数


有关传递参数的更多信息,请参见

如果参数是可选的,则它必须是指针,而不是引用

template<class T>
void f(T** const = 0);
模板
无效f(T**const=0);
如果希望调用样式是按引用传递的,则需要转发器,而不是默认参数

template<class T>
void f_impl(T** const);

template<class T>
void f( T*& arg ) { return f_impl(&arg); }

template<class T>
void f( void ) { return f_impl<T>(0); }
模板
执行无效(T**const);
模板
void f(T*&arg){返回f_impl(&arg);}
模板
void f(void){返回f_impl(0);}
如果要避免空检查,并在未指定参数时放弃对参数的赋值,请执行以下操作:

template<class T>
void f(T*&); 

template<class T>
void f( void ) { T* unused = 0; return f(unused); }
模板
无效f(T*&);
模板
void f(void){T*unused=0;返回f(unused);}

请注意,无参数版本中的
T
是非推断上下文,但没有提供参数时,原始上下文也是如此。

不能引用文本值。太多unncsry abbrvs!您的包装器是一个很好的语法概念,但我担心它不会增加任何语义好处。非常量引用不绑定到右值(尤其是文本)是有原因的,试图破解它是毫无意义的:)@Peter谢谢你的回答。你的第二个例子不适合我。我得到一个错误:错误1错误C2440:“默认参数”:无法从“Nullptr::value”转换为“int*&”@Armen:我的最佳猜测(假设他真的想要左值)是该参数是一个out参数,当您不需要out参数时使用默认参数。在这里,NullPtr::lvalue充当out参数的“接收器”。@Peter:是的,我也这么认为,但想出了一个不同的方法solution@Tinwcd:我的错,我使用的是g++4.5,它没有nullptr,所以我只在0的位置上尝试了它。你可能需要输入const,我会在我的答案中更改它。谢谢你的回答。它确实给我带来了一些新的东西。
template<class T>
void f(T*&); 

template<class T>
void f( void ) { T* unused = 0; return f(unused); }