禁止将const的指针/引用转换为C++中的临时对象(无C++ 0X)

Ste*_*phQ 8 c++ boost metaprogramming

我面临以下问题.考虑以下课程:

//Will be similar to bost::reference_wrapper
template<class T>
class Ref {
public:
  explicit Ref(T& t) : m_ptr(&t) {}
private:
  T* m_ptr;
};
Run Code Online (Sandbox Code Playgroud)

而这个函数返回一个double

double fun() {return 1.0;}
Run Code Online (Sandbox Code Playgroud)

如果我们现在有

double x = 1.0;
const double xc = 1.0;

Ref<double> ref1(x); //OK
Ref<const double> refc1(cx); //OK
Run Code Online (Sandbox Code Playgroud)

不过到目前为止好了:

//Ref<double> ref2( fun() ); //Fails as I want it to
Ref<const double> refc2( fun() ); //Works but I would like it not to
Run Code Online (Sandbox Code Playgroud)

有没有办法修改Ref(你喜欢的方式)而不是函数fun,所以最后一行返回编译时错误?请注意,您可以修改构造函数签名(只要我能够按预期初始化Ref).

Ste*_*sop 2

您可能不喜欢使用它的语法,但让构造函数采用指针而不是引用。你甚至不能使用一个指向临时变量的常量指针。

至少,不是通过另一个包装器走私它,这有望使代码明显错误(TM):template <typename T> T *reftoptr(T &t) { return &t; }

也就是说,如果您按照reference_wrapper使用的方式使用此方法,您的用户可能实际上想要捕获临时数据。只要 Ref 对象也是与它捕获的临时对象具有相同完整表达式的临时对象,我认为就可以了。例如,

some_algorithm(iterator, anotherit, static_cast<Ref<const double> >(fun()));
Run Code Online (Sandbox Code Playgroud)