почему функция const возвращает lvalue, а не rvalue? - PullRequest
0 голосов
/ 13 сентября 2018

Функция ff() возвращает значение r, но когда я изменяю возвращаемое значение функции на const, возвращает ли оно значение lvalue? Почему следующий вывод меняет свой вывод с "lvalue reference" на "rvalue reference", когда я меняю test ff() { } на const test ff() { }

#include <iostream>
using namespace std;
class test { };
void fun( const test& a)
{
    cout << "lvalue reference"<<endl;
}
void fun(  test&& a)
{
    cout << "rvalue reference"<<endl;
}
const test ff() { } // <<---return value is const now
int main()
{

  fun(ff());
}     

Выход:

lvalue reference

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вывод вашей тестовой функции вводит в заблуждение, а тестовые функции должны быть вместо:

void fun( const test& a)
{
    cout << "lvalue const reference"<<endl;
}
void fun( test& a)
{
    cout << "lvalue reference"<<endl;
}
void fun(  test&& a)
{
    cout << "rvalue reference"<<endl;
}
void fun( const test&& a)
{
    cout << "rvalue const reference"<<endl;
}

тогда вы увидите, что там на самом деле происходит.

0 голосов
/ 13 сентября 2018

В таком случае, когда вас интересует, почему компилятор выбрал одну перегрузку вместо другой, часто проще (более или менее) напрямую спросить компилятор, как / почему он принял решение, просто разрешив это выбрать другую функцию и посмотреть, какое сообщение об ошибке оно выдает (или может ли оно вообще не выдавать сообщение об ошибке). В этом случае мы можем удалить функцию, взяв ссылку на константное значение, чтобы получить код, подобный этому:

#include <iostream>
using namespace std;
class test { };
// void fun( const test& a)
// {
//     cout << "lvalue reference"<<endl;
// }
void fun(  test&& a)
{
    cout << "rvalue reference"<<endl;
}
const test ff() { } // <<---return value is const now
int main()
{

  fun(ff());
}

Теперь, если мы попытаемся скомпилировать, компилятор прямо скажет нам, почему оставшаяся функция не была выбрана:

trash9.cpp:16:3: error: no matching function for call to 'fun'
  fun(ff());
  ^~~
trash9.cpp:8:6: note: candidate function not viable: 1st argument ('const test') would lose const qualifier
void fun(  test&& a)
     ^

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

0 голосов
/ 13 сентября 2018

void fun( test&& a) - это функция, которая принимает ссылку на неконстантное значение. ff возвращает const test, которое является постоянным значением. Вы не можете привязать ссылку на неконстантное значение к константному значению, так как это нарушит правильность констант. Вот почему он вместо этого связывается с void fun( const test& a), который принимает ссылку на const test


Обратите внимание, что при возврате по значению нет смысла возвращать const thing сверх thing. Единственное время добавления const к типу возвращаемого значения имеет значение при возврате по ссылке. Если у вас есть функция-член, помеченная как const или возвращающая ссылку на постоянный элемент данных, вы должны использовать const для сохранения константности.

...