GTEST:错误的宏参数数量为假阴性

时间:2018-06-18 14:52:16

标签: c++ googletest

我有一个班级A我已经重载了operator[],以便如果班级a的对象A可以传递给std::valarray它以下列方式:

 std::valarray<int> in{2,1};
 auto b = a[in]; // lets say this returns an int k = 2
 auto c = a[{2,1}]; // also returns an int k = 2

但是,在使用GTEST框架时,它不喜欢a[{2,1}]符号,并且如果我们要尝试macro "EXPECT_EQ" passed 3 arguments, but takes just 2

等测试,则会抱怨EXPECT_EQ(2, a[{2,1}]);

肯定a[{2,1}]是一个参数,因为它评估为int?似乎并非如此。典型的EXPECT_EQ例如EXPECT_EQ(2, 2);就可以了。

下面,我有一个类的MWE,它重载[]以获取std::valarray类型的参数。

class A
{
private:
    std::vector<int> elems;
public:
    A(std::vector<int> elems)
    : elems(elems){};

    int operator[](std::valarray<int> idx) const 
    {
        return get_elem(idx[0]);
    }; // getter

    int get_elem(int idx) const {return this->elems[idx];}; //getter
    int &get_elem(int idx) {return this->elems[idx];}; //setter

  }; 

int main()
{
    std::vector<int> elems = {2, 5, 0, 9,
                              5, 1, 4, 6};

    A a(elems);
    std::cout<< "hello world" << std::endl;

    std::valarray<int> in{2,1};
    auto b = a[in]; // lets say this returns an int k = 2
    auto c = a[{2,1}]; // also returns an int k = 2
    std::cout<< b << std::endl;
    std::cout<< c << std::endl;

    return 0; 
}

鉴于我的main()显示正确的行为,我怀疑GTEST存在问题,或者C ++中的评估顺序与我的预期不同?

1 个答案:

答案 0 :(得分:2)

由于涉及宏,并且没有摆脱它们,最快的解决方案是明智地使用括号:

EXPECT_EQ(2, ( a[{2,1}] ));

额外的对将阻止逗号被解释为宏的参数分隔符。至于比较本身,带括号的表达式与带括号的表达式具有完全相同的值和值类别。所以一切都应该仍然有效 1

<子> 1 - 除非Google Test将decltype应用于第二个令牌序列,否则额外的括号可能会引起意外。但它不应该这样做。