c – 为什么std :: reference_wrapper不接受临时?
发布时间:2020-12-16 03:40:24 所属栏目:百科 来源:网络整理
导读:通常,rvalues可以绑定到const引用(const SomeType).它是内在的语言.然而,std :: reference_wrapper const T不接受作为其构造函数参数的rvalue,因为相应的重载被故意删除.这种不一致的原因是什么?当我们必须通过值但是要保留引用语义的情况下,std :: referen
通常,rvalues可以绑定到const引用(const SomeType&).它是内在的语言.然而,std :: reference_wrapper< const T>不接受作为其构造函数参数的rvalue,因为相应的重载被故意删除.这种不一致的原因是什么?当我们必须通过值但是要保留引用语义的情况下,std :: reference_wrapper是“通告”作为引用变量的替代方法.
换句话说,如果对于const&绑定被认为是安全的,因为它被内置到语言中,为什么C11的设计者不允许rvalue被包装在std :: reference_wrapper< const T>? 什么时候能方便,你可以问.例如: class MyType{}; class Foo { public: Foo(const MyType& param){} }; class MultiFoo { public: MultiFoo(std::initializer_list<std::reference_wrapper<const MyType>> params){} }; int main() { Foo foo{MyType{}}; //ok MultiFoo multiFoo{MyType{},MyType{}}; //error } 解决方法
将临时直接绑定到参考延长其使用寿命.
struct Foo {}; Foo f() { return {}; } void g() { f(); // temporary destroyed at end of full-expression const Foo& r = f(); // temporary destroyed at end of scope // r can still be used here ... // ... // all the way down to here } 但是,它必须直接绑定到临时.请考虑以下示例: struct Bar { Bar(const Foo& f): r(f) {} const Foo& r; }; void h() { Bar b(f()); // binding occurs through parameter "f" rather than directly to temporary "f()" // b.r is now a dangling reference! lifetime not extended } 即使你可以,这将使临时的包装变得无用. 注意:实际的引用包装器对象使用指针,以便可以重新分配: struct Baz { Baz(const Foo& f): p(std::addressof(f)) {} Baz& operator=(const Foo& f) { p = std::addressof(f); return *this; } const Foo* p; }; 同样适用:临时传递给构造函数或赋值运算符将在包含调用的完整表达式的末尾被销毁. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |