Невозможно перегрузить ссылками на *this

Вот список занятых я написал, чтобы поиграть с новой функцией в gcc-4.8.1+ (я думаю, clang-2.9+ тоже должен это делать) для N2439 (ref-qualifiers for 'this'):

class Foo
{
public:
  Foo(int i) : _M_i(i) { }
  int bar() & { return _M_i /= 2; }
  int bar() const & { return _M_i; }
  int bar() && { return 2 * _M_i; }

private:
  int _M_i = 42;
};

int
main()
{
  Foo ph(333);
  ph.bar();

  const Foo ff(123);
  ff.bar();

  Foo(333).bar();
}

Читая стандарт 8.3.5, мне кажется, что три метода bar() должны быть перегружены. Я получаю ошибку компоновщика, хотя:

[ed@localhost ref_this]$ ../bin/bin/g++ -std=c++11 -o ref_this ref_this.cpp
/tmp/ccwPhzqr.s: Assembler messages:
/tmp/ccwPhzqr.s:73: Error: symbol `_ZN3Foo3barEv' is already defined

Если я закомментирую int bar() const & Я не могу решить ff.bar();:

[ed@localhost ref_this]$ ../bin/bin/g++ -std=c++11 -o ref_this ref_this.cpp
ref_this.cpp: In function ‘int main()’:
ref_this.cpp:26:10: error: no matching function for call to ‘Foo::bar() const’
   ff.bar();
          ^
ref_this.cpp:26:10: note: candidates are:
ref_this.cpp:11:7: note: int Foo::bar() &
   int bar() & { return _M_i /= 2; }
       ^
ref_this.cpp:11:7: note:   no known conversion for implicit ‘this’ parameter from ‘const Foo’ to ‘Foo&’
ref_this.cpp:13:7: note: int Foo::bar() &&
   int bar() && { return 2 * _M_i; }
       ^
ref_this.cpp:13:7: note:   no known conversion for implicit ‘this’ parameter from ‘const Foo’ to ‘Foo&&’

Это ошибка GCC или часть стандарта?

Я не на своем компьютере с Clang на нем, но что говорит Clang?

1 ответ

Решение

Эта функция не поддерживается GCC до версии 4.8.0. Он должен поддерживаться GCC 4.8.1, который еще не был официально выпущен.

Насколько мне известно, единственный крупный компилятор, который на данный момент поддерживает квалификаторы ссылок на функции-члены, это Clang. Как видно из этого примера, ваш код прекрасно компилируется на Clang 3.2.

Другие вопросы по тегам