GTEST:宏参数数量不正确的假阴性

GTEST: False negative for incorrect number of macro arguments

我有一个 class A,我已经为它重载了 operator[] 这样如果对象 a of class 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); 就可以了。

下面,我有一个 class 的 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++ 中的评估顺序与我期望的不同?

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

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

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


1 - 除非 Google 测试将 decltype 应用于第二个标记序列,否则额外的括号可能会引起意外。但它不应该那样做。