注意:请参阅编辑,看看为什么它不重复。
请注意在({..})
电话中使用print()
。
#include <iostream>
#include <sstream>
using namespace std;
void print(const std::string& msg) {
cout << msg << endl;
}
int main() {
print(({
ostringstream s;
s << "hello";
s << " world";
s.str();
}));
}
这个构造用在Linux内核代码中 - 这是我第一次遇到它 - 通常在复杂的宏定义中。
事实证明,即使使用-Wall -Wextra
,g ++也会在没有任何警告的情况下编译此代码段。
这件事真的是标准的C和C ++代码吗?如果是这样,它是如何被调用的,哪里可以找到它在最新的C ++(特别是)标准中定义的?
此外,如果它是标准的,那么在C ++中使用它时是否应该记住什么?例如,作用域的“返回值”的复制/移动语义是什么(如果可以称之为)?使用这种结构有哪些可能的缺点? (除了一些不了解或不喜欢它的人。)
编辑:这个问题涉及ANSI C. Are compound statements (blocks) surrounded by parens expressions in ANSI C?
所以现在的问题是,它是合法的C99还是C ++ 11?