ошибка в квалификаторе ссылки

Почему я не могу определить эту функцию,

int *clone() const &
{ 
    return new int(10); 
}

or

int x;
int *clone() const &&
{ 
    return new int(std::move(x)) ; 
}

Я должен иметь возможность добавлять функции квалификатора const. Должен ли я включать какие-либо заголовки?


person Tamim Addari    schedule 19.06.2013    source источник
comment
Что там должны делать & и &&?   -  person Luchian Grigore    schedule 19.06.2013
comment
Что сказал Лучиан Григоре. Кроме того, если x является переменной-членом, а clone() является константным методом, std::move(x) нарушит константную правильность, если будет разрешено компилировать (поскольку это позволит изменить x).   -  person Medinoc    schedule 19.06.2013
comment
и вместо того, чтобы возвращать указатель на int, вероятно, лучше вернуть сам int   -  person Enigma    schedule 19.06.2013
comment
Это не фактическая функция, фактический - это большой класс, а не int, я просто упростил, потому что проблема в квалификаторах.   -  person Tamim Addari    schedule 19.06.2013
comment
@LuchianGrigore: тогда вам следует открыть стандарт C ++. см. мой комментарий к ответу доктора любви.   -  person v.oddou    schedule 09.12.2013
comment
@v.oddou На любой вопрос C++ можно ответить, открыв стандарт C++, так зачем публиковать сообщения на SO, если вы не можете задавать вопросы?   -  person Luchian Grigore    schedule 09.12.2013


Ответы (3)


Вы можете использовать ссылку на значение r для параметров, например, в назначении перемещения или конструкторе перемещения. Кажется, clang пытался использовать расширение, называемое "ссылкой rvalue для * this"', но я предлагаю вам работать с переместите сначала конструкторы и операторы присваивания.

person doctorlove    schedule 19.06.2013
comment
C++11 четко определяет квалификатор ref для функций. см. 8.3.5 [dcl.fct]. поддержка gcc. Вам всем нужно дать ОП перерыв. - person v.oddou; 09.12.2013

Я новичок в С++, и у меня такая же ошибка, как и у вас. Я скомпилировал пример кода из C++ Primer 5th Edition, в котором описывался эталонный квалификатор. Однако мой компилятор GNU показал мне ошибку. Я предполагаю, что текущие компиляторы не поддерживают эту новую функцию, представленную в C++11. И, похоже, мало кто об этом знает, потому что в Интернете очень мало информации. Возможно, более поздние компиляторы будут поддерживать эту функцию.

Многие функции С++ 11 не поддерживаются... Я встречал некоторые из них раньше.

Это часть примера кода, похожего на ваш:

Foo sorted() &&;
Foo sorted() const &
person Tim Zhang    schedule 04.08.2013

Потому что к этому указателю применяется любой квалификатор после имени функции. если вы хотите сделать этот указатель постоянным
, вы должны просто выполнить перегрузку: int *clone() const

person Anand Rathi    schedule 19.06.2013
comment
Итак, когда я использую ссылочные квалификаторы? - person Tamim Addari; 19.06.2013
comment
@TamimAdDari после имени функции? НИКОГДА - person kassak; 19.06.2013
comment
@kassak прав, вы не можете перегружать функцию, используя квалификаторы ссылки ПОСЛЕ имени функции, то есть этого указателя. - person Anand Rathi; 19.06.2013