c++ - 使用 decltype() 和三元运算符有条件地选择类型

标签 c++ c++11 decltype

我有一个文件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 等魔法来获得此行为,但请考虑您是否真的需要/想要它。

关于c++ - 使用 decltype() 和三元运算符有条件地选择类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59445414/

相关文章:

c++ - 什么时候使用大括号括起来的初始化器?

c++ - 将 std::map 与 std::thread 一起使用的意外行为

c++ - C++17 中结构化绑定(bind)引入的标识符有哪些类型?

c++ - 如何循环计数,数字和字母的程序?

c++ - while循环中断,我不知道为什么

c++ - 如何防止 Win32 应用程序在主窗口关闭后在后台运行?

c++ - 获取 const 方法的地址

C++:是否可以从重载 << 运算符的对象中获取 std::string?

c++ - vector 和 map 抛出异常

c++ - 模板、decltype 和非类类型