Аргументы оболочки шаблонной функции C ++ с использованием const & против & - PullRequest
2 голосов
/ 20 февраля 2012

Создание функции-оболочки для конструктора, такой как следующие компиляции, просто отлично:

#include <iostream>

template <typename T>
class wrapper
{
public:
  template <typename A0>
  T* operator () (const A0& a0) const
  {
    return new T(a0);
  }
};

class Foo
{
public:
  Foo(int i) { std::cout << "Foo:Foo(" << i << ")" << std::endl; }
};

int main(int argc, char** argv)
{
  wrapper<Foo>()(42);
  return 0;
}

Но код не компилируется, когда я обновляю строку:

T* operator () (const A0& a0) const

до:

T* operator () (A0& a0) const

Полагаю, это связано с тем, что значение 42 не привязывается к неконстантной ссылке. Но когда я сделаю ссылку const, это будет означать, что я никогда не смогу вызвать конструктор, который фактически принимает неконстантную ссылку. Может кто-нибудь объяснить, что здесь происходит, и что нужно сделать, чтобы это работало?

1 Ответ

1 голос
/ 20 февраля 2012

Полагаю, это связано с тем, что значение 42 не привязывается к неконстантной ссылке.

Да.Правильно.

Но когда я сделаю ссылку const, это будет означать, что я никогда не смогу вызвать конструктор, который фактически принимает неконстантную ссылку.Неправильно.Вы все еще можете назвать это с неконстантной ссылкой.Фактически, именно так работает константность: неконстантная ссылка / указатель / объект может неявно преобразовываться в константную ссылку / указатель / объект, но наоборот это не так.1013 *

...