逗号运算符是否会使用其参数?

时间:2018-10-19 13:34:23

标签: c++ language-lawyer one-definition-rule

根据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

2 个答案:

答案 0 :(得分:7)

这些只是示例,用于说明如何在类中定义重载的逗号运算符。当绑定到参数时,正是这种重载的使用必然会触发odr-use。

用法尚未写入程序中,也没有运算符重载。

您只是在使用the built-in comma operator

(一个更有趣的问题可能是该运算符最右边的操作数是否仍在使用,因为在the wording中,它看起来像是原来的!请记住,使用odr的违规是'不会产生生成错误,在某些情况下则不会。)

我认为在这方面cppreference页面可能不清楚。

答案 1 :(得分:2)

内置逗号不会将其操作数绑定到任何内容。

重载逗号可以,但是重载运算符只是具有有趣拼写的函数。