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,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

