根据odr-use defintion,如果将引用绑定到对象,则该对象将被使用。这就是为什么我相信f使S :: x有用的原因。我不明白的是,与comma operator有什么不同,{{3}}也将其参数绑定到引用参数
struct S {
static const int x = 0; // static data member
// a definition outside of class is required if it is odr-used
};
const int& f(const int& r);
int n = b ? (1, S::x) // S::x is not odr-used here
: f(S::x); // S::x is odr-used here: a definition is required
答案 0 :(得分:7)
这些只是示例,用于说明如何在类中定义重载的逗号运算符。当绑定到参数时,正是这种重载的使用必然会触发odr-use。
用法尚未写入程序中,也没有运算符重载。
您只是在使用the built-in comma operator。
(一个更有趣的问题可能是该运算符最右边的操作数是否仍在使用,因为在the wording中,它看起来像是原来的!请记住,使用odr的违规是'不会产生生成错误,在某些情况下则不会。)
我认为在这方面cppreference页面可能不清楚。
答案 1 :(得分:2)
内置逗号不会将其操作数绑定到任何内容。
重载逗号可以,但是重载运算符只是具有有趣拼写的函数。