C++ C++;聚结类似物

C++ C++;聚结类似物,c++,C++,在c#中,我可以使用语法var c=a??b 接收除null以外的第一个变量(对于相同类型的可为null的变量)。这与transact-sql中的coallesce运算符类似 DECLARE@c VARCHAR=COALESCE(@a,@b)。在C++中有这样的方法吗?< p>在C++中没有一个像这样的内置操作符。此外,在C++中,没有一些非常常见的 null 值,将变量设置为:整数、浮点和布尔变量不能是代码> null < /Calp>> 我们确实有一个名为的特殊“词汇表类型”,其中std::

在c#中,我可以使用语法
var c=a??b
接收除null以外的第一个变量(对于相同类型的可为null的变量)。这与transact-sql中的coallesce运算符类似
DECLARE@c VARCHAR=COALESCE(@a,@b)
。在C++中有这样的方法吗?

< p>在C++中没有一个像这样的内置操作符。此外,在C++中,没有一些非常常见的<代码> null <代码>值,将变量设置为:整数、浮点和布尔变量<强>不能是代码> null < /Calp>> 我们确实有一个名为的特殊“词汇表类型”,其中
std::optional
可以包含类型为
T
的值或“空”/“空选”值,这与其他语言使用
null
的值类似


如果
a
b
是可选的(类型相同),您可以编写:

auto c = a.value_or(b);

注:上述操作适用于常见的非左值引用类型。此外,它将去掉<代码>可选< /COD>包装器,即不能将<代码> NulLopt < /C> >赋值。

< P> C++中没有内置的操作符。此外,在C++中,没有一些非常常见的<代码> null <代码>值,将变量设置为:整数、浮点和布尔变量<强>不能是代码> null < /Calp>> 我们确实有一个名为的特殊“词汇表类型”,其中
std::optional
可以包含类型为
T
的值或“空”/“空选”值,这与其他语言使用
null
的值类似


如果
a
b
是可选的(类型相同),您可以编写:

auto c = a.value_or(b);
注:上述操作适用于常见的非左值引用类型。另外,它也将去掉<代码>可选< /COD>包装器,即不能将<代码> NulLopt < /C> >结果。

< P> >,C++中没有空变量的一般概念,但是“强> DO”/“强”支持可空状态的类型倾向于公开一个公共接口:它们显式转换为<代码>布尔O//>在转换过程中,如果为空,则结果为
false
,否则结果为
true

例如,指针或公开类似指针的接口的类型会发生这种情况,如
std::optional

在所有这些情况下,您可以使用三元运算符来实现所需的结果:

autoc=a?a:b

不过,与合并运算符相反,三值运算符可以对其第一个操作数求值两次。这不是指针(smart或raw)或std::optional
和其他显式和常量转换为bool的类型的问题,而是在转换过程中有副作用的其他类型的问题(目前无法想象有副作用,我敢说,任何非常量转换为bool都应该被视为错误)

但是,Gcc允许您不重复自己的操作并避免副作用。真正的合并()运算符:

autoc=a?:b

,顺便说一下,这似乎是你所要寻找的语法。< / P> < P> >,在C++中没有广义的空变量概念,但是“强> do/<强”支持可空状态的类型往往暴露出一个公共接口:它们显式转换为<代码>布尔-< /代码>,在转换过程中,如果为空,则结果为

false
,否则结果为
true

例如,指针或公开类似指针的接口的类型会发生这种情况,如
std::optional

在所有这些情况下,您可以使用三元运算符来实现所需的结果:

autoc=a?a:b

不过,与合并运算符相反,三值运算符可以对其第一个操作数求值两次。这不是指针(smart或raw)或std::optional
和其他显式和常量转换为bool的类型的问题,而是在转换过程中有副作用的其他类型的问题(目前无法想象有副作用,我敢说,任何非常量转换为bool都应该被视为错误)

但是,Gcc允许您不重复自己的操作并避免副作用。真正的合并()运算符:

autoc=a?:b


顺便说一句,这似乎正是您所寻找的语法。

没有内置的方法可以做到这一点,但为此编写函数应该不难。
a
b
的类型是什么?@HolyBlackCat:但这可能不是OP需要的。在您的情况下,a和b是相同类型的可空变量,你能做自动c=a吗?a:b;没有内置的方法可以做到这一点,但是为此编写一个函数应该不难。
a
b
的类型是什么?@HolyBlackCat:这可能不是OP需要的。a和b是相同类型的可为空变量在你的情况下,你可以自动执行c=a?a:b;optional:中有一个
value\u或
函数。@perreal:的确如此。我把重点放在左值引用上,
value\u或()?a:b
并保留可选属性。可选属性中有一个
值或
函数。@perreal:确实如此。我把重点放在左值引用上,
value\u或()?a:b
并保留可选属性。