不应重载逗号运算符
6.8.9 ID_overloadComma
对于重载的逗号运算符,C++17 之前的标准未声明其子表达式的求值顺序,应避免重载逗号运算符以确保代码的兼容性和正确性。
示例:
class A { .... };
A& operator , (int, A&); // Non-compliant
A& foo(int);
A& bar(int i) {
return ++i, foo(i); // May be disordered
}
例中逗号表达式意在将变量 i 增 1 后作为 foo 的参数,但逗号运算符被重载后变成了一个函数,++i 和 foo(i) 是函数的参数。在 C++17 之前,所有参数的求值顺序均是未声明的,foo(i) 可能会先被求值,++i 便失去了意义。C++17 明确了重载运算符参数的求值顺序与内置运算符一致,但遵循之前标准的编译器仍在广泛使用中,故应考虑兼容性,从而保证正确性。
相关
依据
ISO/IEC 14882:2003 5.2.2(8)-unspecified
ISO/IEC 14882:2011 5.2.2(8)
ISO/IEC 14882:2017 16.3.1.2(2)
参考
MISRA C++ 2008 5-2-11