在if条件中调用构造函数作为逗号表达式的一部分?

时间:2016-10-20 09:55:38

标签: c++ if-statement constructor

这是我的代码。

#include<iostream>
#include<string>


struct Sales_data {
    Sales_data() = default;

    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main()
{
    bool a = true;
    if (Sales_data item, a)
        std::cout << a << std::endl;
}

我不知道为什么编译器告诉我表达式必须有bool类型(或者可以转换为bool)。

2 个答案:

答案 0 :(得分:2)

因为它不是有效的语法。它被解释为两个变量的声明(因此,不是这里的逗号运算符),你不能在if条件中使用它。

您正在尝试使用以下语法在C ++ 17中尝试:

if (Sales_data item; a)

直到那时,如果你想要一个变量作为范围,你可以这样做:

if (a)
{
  Sales_data item;
  ...
}

或者,如果您需要条件中的变量,则可以创建一个封闭范围:

{
Sales_data item;
if (item == ...)
{
   ...
}
} // item is destructed here

答案 1 :(得分:1)

因为那不是有效的if语句。在任何情况下,它都不是任何形式的有效声明。这也是无效的:

bool a;
Sales_data item, a;   // what does this mean?!

这是无效的:

bool a;
bool b = Sales_data item, a;  // ???

在C ++ 17中,你可以做你想要的,但使用不同的语法:

if (Sales_data item; a)
  ...

这类似于for语句中的初始值设定项:

for (Sales_item item; expr; expr)
  ...

语句必须用;分隔,不能用逗号分隔。