некласс rvalues всегда дисквалифицировал условной ценой типы

Раздел §3.10 9 говорит, что "некласс rvalues всегда дисквалифицировал условной ценой типы". Это заставило меня задаться вопросом...

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"
}

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

Править: По-видимому, this также константа rvalue :)

Править: Эта проблема, кажется, устраняется в g ++ 4.5.0, обе строки печатают "rvalue" теперь.

33
задан Xeo 30 May 2012 в 06:26
поделиться

2 ответа

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

Редактировать: Я только что представил сообщение ON COMP.ST.C ++, отметив проблему и предлагающую новую формулировку для соответствующей части стандарта. К сожалению, будучи модерированной группой новостей, почти все, вероятно, забыли этот вопрос к тому времени, когда это делает его через очередь одобрения.

11
ответ дан 27 November 2019 в 19:34
поделиться

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

Критерии выбора для лучших Функция - количество аргументов, Насколько хорошо аргументы соответствуют Список типов параметра кандидата Функция, [...]

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

Ваш вопрос охватывается в проекте стандарта, который у меня есть, хотя (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. Для Lvalue и 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&&)
2
ответ дан 27 November 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: