【问题标题】:how to use a rvalue reference in a switch's case如何在开关的情况下使用右值引用
【发布时间】:2020-05-23 19:14:12
【问题描述】:

我想在 switch(T) 的情况下使用 t(rvalue reference),但我收到错误 the value of 't' is not usable in a constant expression。如何以正确的方式做到这一点。

#include <iostream>
using namespace std;
int main(){
    int (&&t)=5;
    int T{};
    switch(T){
        case t:   // error in this case
            cout<<t<<endl;
            break;
        default:
            cout<<"default"<<endl;
            break;
    }
}

【问题讨论】:

  • 恕我直言,你的例子毫无意义。你又想达到什么目的?你为什么要打开一个未初始化的变量——你希望这样做有什么好处?你希望这个程序打印什么,为什么?
  • 我正在尝试理解右值引用。 T 是未初始化的(switch 将使用它的默认大小写)。
  • 不,从未初始化的变量中读取是未定义的。
  • 我的错,我现在已经初始化了 T
  • 编译器告诉你的。 5 是一个常量表达式。 t 不是。

标签: c++ switch-statement rvalue-reference


【解决方案1】:

注意switch 语句中的case labels 必须是常量表达式。

您不能将右值引用用作 case 标签,因为它不是常量表达式。但是,您可以使用编译时初始化变量:

constexpr int t = 5;
switch(...)
{
  case t : ...  // ok
}

请注意,尝试执行以下操作:

int const &&t = 5;

也不起作用,因为初始化器不是常量表达式,所以我知道没有办法让您使用右值引用作为案例标签。

另请注意,类似:

int const t = ...

除非初始化程序是常量表达式(即在编译时已知),否则将不起作用。所以:

int const t = 5;

会起作用,但是:

int n = 5;
int const t = n;

不会。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2019-08-03
    相关资源
    最近更新 更多