确定是否通过临时

时间:2011-08-24 02:42:07

标签: c++ c++11

假设我有一个类C和一个创建C实例的函数make_c(x)

C通过引用存储x

make_c(x)是一个未命名的临时(当然会在行尾破坏,留下悬空引用)但是接受命名的临时值和其他时,如何编写x来编译错误值?

3 个答案:

答案 0 :(得分:5)

我相信这应该有你正在寻找的语义:

template<typename X>
C make_c(X&& x)
{
    static_assert(
        !std::is_rvalue_reference<decltype(std::forward<X>(x))>::value,
        "x must not be a temporary"
    );
    return C(std::forward<X>(x));
}

警告:由于decltype的实现存在缺陷,因此VC ++ 2010无法正常工作(您需要在std::identity<>中包装decltype)。

答案 1 :(得分:1)

我认为在语言中不可能,因为你需要通过任意函数来检查流量控制。

struct Foo{
};

Foo const & sanitize(Foo const & f){ return f;}

void checkThisFunction(Foo const & f){
   //we'd like to ensure at compile time that f is not a temporary
}

int main(){
   Foo f;
   checkThisFunction(sanitize(f));
   checkThisFunction(sanitize(Foo()));
   return 0;
}

答案 2 :(得分:0)

除非我完全误解了右值引用,否则这种事情应该可以通过简单的重载来实现。

void foo(int&&) = delete;
void foo(const int&) { }

int main()
{
   int a;
   foo(a);
   foo(42);  //error, prefers binding to the deleted overload
}