有条件地选择带有decltype()和三元运算符的类型

问题描述 投票:0回答:1

我有一个文件a.cpp

#include <bits/stdc++.h>

using namespace std;

int main(){
    int a=5;
    double b=4.3;
    decltype(a>b?a:b) n;
    cout << typeid(n).name();   
}

以上代码的输出为d,但我希望它为i,因为“ a”大于“ b”

我正在尝试了解decltype。你能告诉我我在这里想念的吗?

我正在使用gcc版本6.3.0(MinGW.org GCC-6.3.0-1)。

c++ c++11 decltype
1个回答
1
投票

C ++是一种静态类型的语言。

这意味着事物的类型不能取决于运行时条件。

由于这个原因,表达式a>b?a:b将始终等于相同类型的值。这是条件运算符规则的一部分。

在这种情况下,“相互兼容的类型”(我已将其定义为double,因此您将始终获得double(请参阅规则here)。

如果a赢得条件,则将其从int转换为double,除了在decltype中,您的代码是“未评估的上下文”(因为在运行时任何内容都不会影响结果),因此条件是甚至不执行,仅从参数到条件运算符的类型中计算可能的结果类型。如果有多个可能的结果类型,那么代码将是模棱两可的,并且您的程序将无法编译。

您可以使用std::variant这样的魔术来获得这种行为,但是请考虑您是否[[真的是否需要/想要它。

© www.soinside.com 2019 - 2024. All rights reserved.