引用指针的默认值

时间:2010-11-13 18:53:27

标签: c++ pointers

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

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

我收到了一个错误:

  

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

如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

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

template<class T>
void f(T** const = 0);

如果您希望call-style是pass-by-reference,那么您需要一个转发器,而不是默认参数。

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); }

如果您想避免空检查,并且在没有给出参数时放弃对参数的赋值,请执行以下操作:

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

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

请注意,无参数版本中的T是一个非推导的上下文,但在没有提供参数的情况下也是如此。

答案 1 :(得分:1)

基本上,如果你需要用nullptr调用这个函数(这意味着“我没有传递给函数的值,但是想要调用它”) ,那么你想要根据T**得出参数。

有关传递参数的更多信息,请参阅 How to pass objects to functions in C++?

答案 2 :(得分:0)

你有一个指针的l值引用,所以你需要将它默认为l值。由于l值不能是nullptr(它是一个r值),要么你需要改变函数来取一个r值:

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

或者,为所有类型T定义一些l值指针。

template <typename T>
struct NullPtr
{
    static T const* lvalue = nullptr;
};

template <typename T>
void f(T const*& = NullPtr<T>::lvalue)

但是我无法想象你实际上有什么理由希望l值默认为那个。