【问题标题】:How to force, value to be lvalue reference?如何强制,值成为左值参考?
【发布时间】:2020-06-24 20:22:42
【问题描述】:

我希望我的函数采用 lvalue 引用,绝对不是 rvaluetemporary 或其他。

这是我的功能:

template<class T>
void foo(T& value) {}

// Imagine I have a class Foo
struct Foo
{ 
   int a;
   int b;
};

当我调用foo(Foo{1, 2}) 时,首先,即使我要求lvalue 引用,它也会编译,其次,它不起作用,因为foo 存储了传递值的地址,所以我以后读的时候就垃圾了。

如何强制foo 获取左值引用?

【问题讨论】:

标签: c++ c++11 templates lvalue function-templates


【解决方案1】:

首先,给定的代码默认不会在GCC and Clang编译,只会在MSVC with non-standard extensions编译。

如果您想确保foo() 不接受右值,只需delete that overload

template<class T>
void foo(T&& value) = delete;

【讨论】:

  • 这是一个通用参考,因此无论值类别如何都会触发。您依靠偏序来选择左值引用;更好的做法是限制已删除的函数模板,使其不会胜过需要转换的普通函数。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多