AFAIK,具有模板参数<Type>
的模板类与<const Type>
完全不同。
template<typename T>
struct Wrapper
{
T obj = T{};
//other code
};
现在我无法将Wrapper<int>&
传递给需要Wrapper<const int>&
的函数。
void someFunc(Wrapper<const int>& wrapper);
//...
Wrapper<int> wrapper;
someFunc(wrapper); //error
reinterpret_cast
将其设置为常量版本会出现什么问题?
operator Wrapper<const T>&() { return *(reinterpret_cast<Wrapper<const T>*>(this)); }
将上面的行添加到Wrapper
可以使它在不必创建新的<const int>
对象的情况下工作。函数内部无法访问obj
,因此传递的参数实际上是<const Type>
还是<Type>
应该无关紧要。
如果没有模板专业化,这里会出错吗(就标准与实践而言(?
在常量和非常量情况下,有许多优化可能不同,这意味着类的内存布局(例如,由于常量对象实际上不需要存在(和类的使用可能不同。
换言之:对此使用repret_cast可能会导致意外行为,不应该这样做。
在我看来,有几种方法可以使const
关键字的过度使用导致更复杂的代码而没有任何好处,这就是其中之一
我建议避免<const Type>
案例,而不是试图处理它们。
在不了解用例的情况下,在我看来,大多数用例都将通过使用const Wrapper<T>
而不是Wrapper<const T>
来覆盖。