假设我有一个类C
和一个创建C实例的函数make_c(x)
。
C
通过引用存储x
。
当make_c(x)
是一个未命名的临时(当然会在行尾破坏,留下悬空引用)但是接受命名的临时值和其他时,如何编写x
来编译错误值?
答案 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
}