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
应用于第二个标记序列,否则额外的括号可能会引起意外。但它不应该那样做。
我有一个 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
应用于第二个标记序列,否则额外的括号可能会引起意外。但它不应该那样做。