значения r, не относящиеся к классу, всегда имеют неквалифицированные типы cv

StackOverflow https://stackoverflow.com/questions/2169932

Вопрос

§3.10 в разделе 9 говорится, что "значения r, не относящиеся к классу, всегда имеют типы, не соответствующие требованиям 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 для типов, не относящихся к классу bar() предпочитает привязываться к const int&&.Это ошибка компилятора?

Редактировать:Очевидно, this также является постоянным значением r :)

Редактировать:Эта проблема, похоже, исправлена в g ++ 4.5.0, теперь в обеих строках выводится "rvalue".

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

13.3.3.1.4 Привязка к ссылке

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

и

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

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

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

— S1 и S2 являются ссылочными привязками (8.5.3) и ни одна из них не ссылается на неявный параметр объекта нестатического функция-член объявлена без ref-квалификатора, и либо 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&&)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top