Значение по умолчанию для ссылки на указатель - PullRequest
4 голосов
/ 13 ноября 2010

Мне нужно, чтобы последний аргумент в моей функции был аргументом по умолчанию, и тип этого аргумента *& (ссылка на указатель). По некоторым причинам это не работает для меня:

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

Я получаю сообщение об ошибке:

Ошибка 1, ошибка C2440: «аргумент по умолчанию»: невозможно преобразовать из «nullptr» в «T *&»

Как обойти это?

Ответы [ 3 ]

3 голосов
/ 13 ноября 2010

Если аргумент является необязательным, он должен быть указателем, а не ссылкой.

template<class T>
void 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); }

Если вы хотите избежать нулевых проверок и просто отменить присвоение параметру, когда параметр не указан, сделайте следующее:

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

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

Обратите внимание, что T в версии без аргументов является не выводимым контекстом, но то же самое было и в оригинале, когда не было предоставлено никаких параметров.

1 голос
/ 13 ноября 2010

По сути, если вам нужно вызвать эту функцию с помощью nullptr (что означает «У меня нет значения для передачи в функцию, но я все равно хочу вызвать его» * ​​1003 *), тогдахотел бы принять аргумент за T**.

См. Как передавать объекты в функции в C ++? для получения дополнительной информации о передаче аргументов.

0 голосов
/ 13 ноября 2010

У вас есть ссылка l-значения на указатель, поэтому вам нужно будет установить по умолчанию его значение l. Поскольку l-значения не могут быть nullptr (это r-значение), вам также нужно изменить функцию, чтобы она принимала r-значение:

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

или определить некоторый указатель l-значения для всех типов T.

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

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

но я не могу представить причину, по которой вы бы хотели, чтобы значение l по умолчанию имело значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...