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版本中).谢谢!
根据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)