Раздел §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" теперь.
Комитет уже вродит, что в этой части стандарта есть проблема. CWG Выпуск 690 говорит о некоторой аналогичной проблеме с точно такой же частью стандарта (в «Дополнительной записи» с сентября 2009 года). Я думаю, что новый язык будет составлен для этой части стандарта в ближайшее время.
Редактировать: Я только что представил сообщение ON COMP.ST.C ++, отметив проблему и предлагающую новую формулировку для соответствующей части стандарта. К сожалению, будучи модерированной группой новостей, почти все, вероятно, забыли этот вопрос к тому времени, когда это делает его через очередь одобрения.
Хорошая точка. Я думаю, что есть две вещи, которые будут смотреть на: 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&&)