算术运算有空吗?

时间:2014-02-19 18:41:15

标签: c++ c++11 void arithmetic-expressions

我知道如果可能的话,以下情况绝对是不好的做法,但我想知道这是否可行。

问题如下:是否有可能在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 */

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

4 个答案:

答案 0 :(得分:6)

我不确定它有多大意义,但你可以在这里使用comma operator

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

答案 1 :(得分:5)

您可以使用comma operator

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

并使用 GCC ,您可以使用其statement expression扩展程序:

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

并且在标准C++11中,您可以使用并拨打匿名closure

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

答案 2 :(得分:2)

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

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

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

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

关于你的问题,你可以写

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

使用逗号运算符。

或者将这两个电话分开可能会更好

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

答案 3 :(得分:0)

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

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);

来吧,这没有结束

.....