模板常量类型转换运算符不能在linux下工作(gcc)

Nat*_*han 5 c++ templates types const type-conversion

考虑以下程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

它在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
Run Code Online (Sandbox Code Playgroud)

为什么?为什么不采用const类型转换运算符?我该如何解决这个问题,并且仍然有方便的模板化类型转换运算符(在const而不是const版本中).谢谢!

Joh*_*itb 5

根据C++ 03标准,该代码格式不正确,因为模板参数推断将无法推断X&X const&反对const double.

C++ 03错过了说明在推论之前从转换函数的返回类型中删除了引用,因此在您的情况下永远不会得到匹配.对于C++ 0x,这将被修复并包含在最新的工作文件中,因此可以使用一些包含该修复程序的编译器进行编译.

你的代码实际上有一个不同的问题:GCC 确实实现了这个缺陷报告的解决方案,并因此比较double(在扣除之前剥离cv-qualifiers!)反对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);
Run Code Online (Sandbox Code Playgroud)