оператор преобразования типа константы шаблона не работает под Linux (GCC) - PullRequest
5 голосов
/ 23 ноября 2010

Рассмотрим следующую программу:

#include <iostream>

template<int s>
class Pack
{
public:
    Pack(){}
    char data[s];
    template<typename X> operator X&(){ return *reinterpret_cast<X*>(data); }
    template<typename X> operator X const&()const{ return *reinterpret_cast<const X*>(data); }
};

int main()
{
    const Pack<8> p;
    const double d(p);
    std::cout<<d<<std::endl;
}

Прекрасно компилируется под Windows.Под Linux я получаю:

test.cc: In function ‘int main()’:
test.cc:17: error: passing ‘const Pack<8>’ as ‘this’ argument of ‘Pack<s>::operator X&() [with X = double, int s = 8]’ discards qualifiers

Почему?Почему он не принимает оператор преобразования типа const?Как я могу это исправить и при этом иметь удобный шаблонный оператор преобразования типов (в const, а не в const версии).Спасибо!

1 Ответ

5 голосов
/ 23 ноября 2010

В соответствии со Стандартом C ++ 03 этот код некорректен, потому что вывод аргумента шаблона не сможет вывести X& или X const& против const double.

C ++ 03 пропущено, чтобы утверждать, что ссылка отбирается из возвращаемого типа функции преобразования до вычета, поэтому вы никогда не сможете получить совпадение в вашем случае.Для C ++ 0x это будет исправлено и включено в последний рабочий документ, поэтому может компилироваться с некоторыми компиляторами, которые включают исправление задним числом.

Ваш код на самом деле имеет другую проблему: GCC реализует реализацию этого отчета о дефектах и, следовательно, сравнивает double (он удаляет cv-квалификаторы до вывода!) против X и против X const.Только X соответствует и, следовательно, только первая функция преобразования является единственным кандидатом в вызове с аргументом const Pack<8> - поэтому GCC жалуется на отсутствие const в функции преобразования.Если вы попробуете следующий код, он будет работать

// can't strip cv-qualifiers off "double const&" - there are no top-level 
// cv qualifiers present here!
double const &d(p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...