【问题标题】:Left and Right operand of comma operator has no effect (Warning)逗号运算符的左右操作数无效(警告)
【发布时间】:2014-03-08 09:03:05
【问题描述】:

我在课堂上的构造函数中收到警告,我以前从未见过。这就是我的构造函数的样子。

    Account(std::string n = "NULL", std::string i = "0", Stats s = (0,0,1) ) 
        : name(n), id(i), stat(s) {}

如果我删除这些逗号中的任何一个,都会导致编译错误,不是吗? 此警告是否不正确,或者我可以更改什么来修复它?

【问题讨论】:

  • 如果您真的复制警告,我可以提供帮助。
  • 我在标题中写了警告,省略了[-Wunused-value]

标签: c++ class constructor warnings comma


【解决方案1】:

问题是这样的:(0,0,1)

这是表达式0,0,1 周围的括号,其计算结果为1。 (逗号运算符是一个中缀运算符,它计算第一个和第二个表达式并返回第二个。在这种情况下,您有两个这样的运算符。)

我不知道你想要什么,但我猜不是这样。


编辑:看来你想要Stats s(0,0,1)

【讨论】:

  • 这是另一个由 Stats(int, int, int); 组成的构造函数。我用它来分隔初始化值。
  • 我刚刚重新阅读了这个问题,并意识到我给了你一个错误的建议。该语法不能用于默认参数...对不起... xD
【解决方案2】:

问题很可能出在Stats s = (0,0,1) 的那部分。 C++ 将此视为要计算的表达式序列,同时仅保留最后一个值。它返回 1。你可能的意思是

Stats s = Stats(0,0,1)

如果你的 stats 结构有这样的构造函数,它会起作用。请注意,在 C++11 中,您的语法更短:

Stats s = {0,0,1}

【讨论】:

  • 我不确定这是否有效。您需要在初始化结构时使用常规括号。花括号用于初始化数组。
  • @EnginKayraklioglu 不,这是错误的。在某些情况下(不是这个),在 C++11 之前是正确的。
  • @juanchopanza 感谢您的解释。也许即使在旧版本中也是合法的,我只是从未遇到过。
  • @EnginKayraklioglu Pre-C++11,这取决于Stats是否是一个聚合
  • 是的,大括号消除了该警告。但如果使用 pre c++11,它们将无法工作。
【解决方案3】:

我认为您正在寻找的是为作为结构的函数参数提供默认值,我认为它已在此处讨论过 How can I assign a default value to a structure in a C++ function?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多