2015-07-22 2 views
1

Рассмотрим этот простой код:неявное преобразование постоянного

struct vec { 
__m128 m128; 
    inline operator __m128 &() { 
     return m128; 
    } 
} 
void someFunction(const vec &v) { 
    someOtherFunction(v); //takes __m128 as argument 
} 

Всякий раз, когда я называю SomeFunction я получаю ошибку о том, что я не могу конвертировать из постоянной V в __m128

Я попытался добавить это к структура

inline operator const __m128 &() { 
    return m128; 
} 

но я получаю ошибки везде говорят «не могу преобразовать аргумент VEC в __m128

+0

Вы пытались сменить спецификатор const на сам оператор? (т. е. 'inline operator const __m128 &() const {...}'.) Со второй версией вы возвращаете 'const __m128', но сама функция не« безопасна »для вызова с const' vec' s. – Alejandro

ответ

4

Попробуйте это:

struct vec 
{ 
    __m128 m128; 

    operator __m128&() 
    { 
     return m128; 
    } 

    operator const __m128&() const 
    { 
     return m128; 
    } 
}; 

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

+0

работы Я просто не знаю почему. Я думал, что спецификатор const на функциях означает, что «этот» указатель не существует, и вы не можете получить доступ к классу/структуре, но вам нужно получить доступ к возврату m128, не так ли? – Thomas

+1

Вы путаете это со статическими методы. Статические методы не имеют указателя «this». Const методы делают, но «этот» указатель const (в этом случае это будет 'const vec * this'). – user1610015

+0

@ Ragdoll const в функциях-членах означает, что функция не изменяет объект. Он позволяет вызывать функцию для const-объектов и ссылок. – emlai

Смежные вопросы