带有空的算术运算



我知道,如果可能的话,以下内容绝对是一种不好的做法,但我想知道这是否可能。

问题如下:是否有可能在C++(并且编译器不会抛出任何警告)使用返回 void 的函数执行无用的算术运算。

std::vector<int> v;
int i = 42 + v.resize(42); 
/* How to transform the last line to execute resize and to have i = 42 */

我知道这是愚蠢的,但这不是问题...

我不确定这是否有意义,但您可以在此处使用逗号运算符:

int i = (v.resize(42), 42);

您可以使用逗号运算符:

int i = (v.resize(42), 42);

对于 GCC,您可以使用其语句表达式扩展:

int i = ({v.resize(42); 42;})

在标准 C++11 中,您可以使用并调用匿名闭包:

int i = ([&v]() {v.resize(42); return 42;}());

类型 void 没有值,因此不能在算术表达式中使用。

在我看来,杆件功能resize的设计很糟糕。它应该返回对象本身,而不是void。在这种情况下,您可以例如编写

int i = v.resize(42).size(); 

我在讨论C++标准的论坛上指出了这一点。

至于你的问题,你可以写

int i = ( v.resize(42), v.size() );

使用逗号运算符。

或者也许最好将这两个调用分开

v.resize(42);
int i = v.size();

不明白重点,但这是另一种方式

std::tie(i, std::ignore) = std::make_tuple(42, (v.resize(42),1) );

你也可以做:

if ((i=42)) v.resize(42); 

不要忘记

do { v.resize(42); } while (!(i=42)); 

和最爱

(i=42) ? v.resize(42) : i;

或者(帖子中唯一严肃的 c++

int i(0);
std::vector<int> v(i=42);

来吧,这没有尽头

.....

最新更新