Вопрос о C ++ 0x ссылках свернуть - PullRequest
5 голосов
/ 13 декабря 2010

Я не знаю, почему этот код не может быть скомпилирован.Я протестировал в Visual C ++ 2010 и GCC с -std = c ++ 0x.кто-нибудь дать какое-нибудь предложение?спасибо!

template<typename T>
class Foo
{
public:
 void test(const T&){cout<<"const";}
 void test(      T&){cout<<"non const";}
};

int main()
{
 int a;
 Foo<int&> f;
}

ошибка компиляции: 'void Foo :: test (T)': функция-член уже определена или объявлена ​​

, но почему это может быть скомпилировано?

Я читал c ++ 0x В статье сказано: T & & == T &, поэтому const T & & == const T &?

Ответы [ 3 ]

13 голосов
/ 21 декабря 2010

Я читал c ++ 0x В статье говорилось: T & & == T &, поэтому const T & & == const T &?

На самом деле, это не имеет большого смысла. ИМХО, лучше положить это в таблицу:

T       T&      const T      const T&
---------------------------------------
int     int&    const int    const int&
int&    int&    int&         int&
        (1)     (2)          (1+2)

1: Reference collapsing in action
2: const applies to the reference and is therefore ignored

Если T уже является ссылкой (2-я строка), const в const T применяется к ссылке , а не к рефери. Но ссылка по своей природе постоянна в том смысле, что вы не можете заставить ее ссылаться на другой объект после инициализации, поэтому const здесь просто игнорируется. Вы можете думать об этом как о "константном разрушении". ; -)

8 голосов
/ 13 декабря 2010

This:

Foo<int&> f;

дает начало этому экземпляру:

class Foo<int&>
{
public:
 void test(int&);
 void test(int&);
};

const, примененный к типу, который является ссылкой, является недопустимым.Сравните ее с нестатической функцией-членом, работающей с опорным элементом данных:

struct A {
  int &ref;

  // valid: const member function doesn't treat "ref" as "const int&". 
  void operate() const {
    ref = 0;
  }
};

Вы должны передать int в Foo<...>, чтобы достичь своей цели.

1 голос
/ 01 апреля 2012

По второму вопросу две экземпляры функций имеют один и тот же тип параметра, и обе они являются шаблонами (если одна является шаблоном, другая - не шаблонной, разрешение перегрузки выберет более позднюю), поэтомуРазрешение перегрузки выберет шаблон, который является более специализированным.Обычно const T & является более специализированным типом, чем T &, поэтому вызывается первая шаблонная функция.

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