неclassовые значения всегда имеют cv-неквалифицированные типы

В разделе 9.10 раздела 9 говорится, что «неclassические значения всегда имеют cv-неквалифицированные типы». Это заставило меня задуматься …

int foo() { return 5; } const int bar() { return 5; } void pass_int(int&& i) { std::cout << "rvalue\n"; } void pass_int(const int&& i) { std::cout << "const rvalue\n"; } int main() { pass_int(foo()); // prints "rvalue" pass_int(bar()); // prints "const rvalue" } 

Согласно стандарту, нет такой вещи, как const rvalue для неclassических типов, но bar() предпочитает связывать с const int&& . Это ошибка компилятора?

EDIT: По-видимому, this также константа rvalue 🙂

EDIT: эта проблема, похоже, исправлена ​​в g ++ 4.5.0, обе строки печатают «rvalue» сейчас.

Комитет уже, похоже, осознает, что в этой части стандарта есть проблема. В выпуске 690 CWG обсуждается несколько схожая проблема с точно такой же частью стандарта (в «дополнительной заметке» от сентября 2009 года). Я предполагаю, что новый язык будет подготовлен для этой части стандарта в ближайшее время.

Изменить: я только что отправил сообщение на comp.std.c ++, отметив проблему и предложив новую формулировку для соответствующей части стандарта. К сожалению, будучи модерируемой новостной группой, почти все, вероятно, забудут этот вопрос к тому моменту, когда он будет проходить через очередь утверждения.

Хорошая точка зрения. Я думаю, есть две вещи, на которые нужно обратить внимание: 1) как вы указали неclassическое значение rvalue и 2) как работает разрешение перегрузки:

Критерии выбора для наилучшей функции – это количество аргументов, насколько аргументы соответствуют параметру-типу-списку функции-кандидата, […]

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

Ваш вопрос освещен в проекте стандарта, который у меня есть (N-4411):

Однако вступление в игру – это параллельное чтение ссылочного связывания, неявных последовательностей преобразования, ссылок и разрешения перегрузки в целом:

13.3.3.1.4 Ссылка на привязку

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

а также

13.3.3.2. Ранжирование неявных последовательностей преобразования

3 Две неявные последовательности преобразования одной и той же формы являются неотличимыми последовательностями преобразования, если не применяется одно из следующих правил:

– Стандартная последовательность преобразования S1 является лучшей последовательностью преобразования, чем стандартная
последовательность преобразования S2, если

– S1 и S2 являются привязками привязки (8.5.3), и ни один из них не ссылается на неявный объектный параметр нестатической функции-члена, объявленной без реф-квалификатора, и либо S1 связывает ссылку lvalue с l-значением, а S2 связывает ссылку rvalue или S1 связывает ссылку rvalue с rvalue и S2 связывает ссылку lvalue.

[ Пример:

 int i; int f(); int g(const int&); int g(const int&&); int j = g(i); // calls g(const int&) int k = g(f()); // calls g(const int&&) 
  • Является ли возrotation ссылкой rvalue более эффективным?
  • Можно ли std :: переместить объекты из функций? (C ++ 11)
  • Нужны ли ссылки rvalue на const?
  • Существует ли reference_wrapper для ссылок rvalue?
  • Передача rvalues ​​через std :: bind
  • О том, как распознать ссылку Rvalue или Lvalue и правило if-it-have-a-name
  • Правило-тройка становится Правилом пяти с C ++ 11?
  • Разрешение перегрузки между объектом, ссылкой rvalue, константой ссылки
  • Есть ли случай, когда полезно использовать ссылку RValue Reference (&&)?
  • Interesting Posts

    Ошибка отправителя Google Chromecast, если расширение Chromecast не установлено или использует инкогнито

    Как сгладить дерево через LINQ?

    Половина установленной оперативной памяти – это аппаратное обеспечение

    Crash или «segmentation fault», когда данные копируются / отсканированы / прочитаны неинициализированному указателю

    Передайте текущую команду на съемный сеанс (tmux / screen)

    Android Studio: отказ

    В чем разница между шаблонами зависимостей зависимостей и шаблонов Locator?

    Удалить в Mac OS X?

    Четыре ядра имеют меньшую скорость процессора, они все же лучше?

    Как я могу получить размер массива, коллекции или строки в Java?

    Преобразовать serial.read () в полезную строку с помощью Arduino?

    Где можно загрузить предыдущие версии операционных систем Microsoft?

    В чем разница между SSD-дисками mSATA и SATA?

    Как вы разворачиваете опции Swift?

    Самый простой способ обслуживания статических данных вне сервера приложений в веб-приложении Java

    Давайте будем гением компьютера.