You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20中如何在三元表达式中返回std::tuple?

问题原因

C++的三元运算符?:要求两个结果分支必须是具有明确类型的表达式,而{...}这种初始化列表本身不属于表达式,没有固定类型,编译器无法推导两个{...}分支的共同类型,因此会抛出"expected an expression"错误。

而if-else中的return {...}能正常工作,是因为编译器明确知道要构造的目标类型是函数返回值std::tuple<double, double, double>,可以直接用初始化列表完成返回值的构造。

解决方法

只需要给两个分支的初始化列表显式指定std::tuple类型,让它们成为具有明确类型的表达式即可,有两种常见写法:

写法一:直接用std::tuple列表构造

#include <tuple>
#include <cstdlib> // 包含std::abs的头文件

using std::tuple;

double hue(double b, double g, double r, double d, double i);

tuple<double, double, double> HSL_pixel(double b, double g, double r, double i, double x, double z) {
    double s = x + z;
    double d = z - x;
    double avg = s / 2;
    return d ? tuple{hue(b, g, r, d, i), d / (1 - std::abs(s - 1)), avg} : tuple{0.0, 0.0, avg};
}

写法二:使用std::make_tuple

#include <tuple>
#include <cstdlib>

using std::tuple;
using std::make_tuple;

double hue(double b, double g, double r, double d, double i);

tuple<double, double, double> HSL_pixel(double b, double g, double r, double i, double x, double z) {
    double s = x + z;
    double d = z - x;
    double avg = s / 2;
    return d ? make_tuple(hue(b, g, r, d, i), d / (1 - std::abs(s - 1)), avg) : make_tuple(0.0, 0.0, avg);
}

内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:45:07