繁体   English   中英

何时使用具有静态存储持续时间的右值引用?

[英]When to use rvalue references with static storage duration?

C ++ 11允许在全局(,名称空间,类)范围内声明右值引用,并具有静态存储持续时间。 使用这些变量的好方案是什么? 我做了几次测试,并提出了一些观察结果。 以下代码将无法编译(g ++ 5.3)

double&& m = 3.5;
double&& s() {return m;}

testy.cpp:在函数'double && s()'中:

testy.cpp:7:22:错误:无法将'double'左值绑定到'double &&'double && s(){return l;}

这是违反直觉的,甚至认为我们声明了一个右值引用,它被视为数据按值返回。 当然,这是一个人为的例子,实际上返回一个右值参考是很少见的。 但是为什么它不起作用? 我的解释是,通过使用静态存储持续时间声明右值参考m ,我们得到了一种“通用参考”形式,这是由Scott Meyers创造的一个术语(更多信息在这里 )。 通用引用的一个属性是它可以绑定到左值和右值。 然而,与依赖于由于类型替换引起的参考崩溃的“通用参考”不同,我所不清楚上述解决方案中涉及的机制。 事实上,以下代码编译没有问题。

double&& m = 3.5;

int main() {
    double a {4.2};
    double& b = a;
    m = a;
    m = b;
    m = 3.2;
}

因此,如上所述, m双重的每种风味结合。 但是,变量具有静态存储持续时间的事实似乎与绑定到临时对象的rvalues的性质相矛盾。 很少有问题出现。 为什么允许这样做? 什么情况会利用这个属性? 我的第一个猜测是,我们可以使用它来提供模板特化,它接受任何参数的“味道”,就像通用引用一样,除了它们与底层类型绑定得更强。 此外,“静态右值参考”的范围似乎无关紧要,即具有静态存储持续时间和“功能”范围的右值也表现出如下所示的行为。

int main() {
    static double&& a = 4.2;
    double b = 3.2;
    double& c = b;
    a = b;
    a = c;
}

它无法编译的原因是在错误消息中:

testy.cpp:7:22:错误:无法将'double' 左值绑定到'double &&'double && s(){return l;}

命名变量总是左值 - l是左值。 s()返回一个右值。 你必须使用强制转换来完成这项工作:

double&& s() {return std::move(m); }

为什么允许这样做? 什么情况会利用这个属性?

是否真的值得在明确禁止它的语言中添加一个例外?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM