我有一个文件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 ++是一种静态类型的语言。
这意味着事物的类型不能取决于运行时条件。
由于这个原因,表达式a>b?a:b
将始终等于相同类型的值。这是条件运算符规则的一部分。
在这种情况下,“相互兼容的类型”(我已将其定义为double
,因此您将始终获得double
(请参阅规则here)。
如果a
赢得条件,则将其从int
转换为double
,除了在decltype
中,您的代码是“未评估的上下文”(因为在运行时任何内容都不会影响结果),因此条件是甚至不执行,仅从参数到条件运算符的类型中计算可能的结果类型。如果有多个可能的结果类型,那么代码将是模棱两可的,并且您的程序将无法编译。
您可以使用std::variant
这样的魔术来获得这种行为,但是请考虑您是否[[真的是否需要/想要它。