温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - Is this a bug in GoogleTest AssertionResult?
c++ googletest sfinae

c++ - 这是GoogleTest AssertionResult中的错误吗?

发布于 2020-03-31 23:28:59

我已经EXPECT_TRUEgtest.h修剪了

#include <type_traits>
#include <iostream>

class rai_class {
    public:
        static bool const value = true;
};

class AssertionResult {
 public:
  template <typename T>
  explicit AssertionResult(
      const T& success,
      typename std::enable_if<
          !std::is_convertible<T, AssertionResult>::value>::type*
          = nullptr)
      : success_(success) {}

  operator bool() const { return success_; }
 private:
  bool success_;
};

// Test type trait
bool test_rai_hash_implemented()
{
    return AssertionResult(rai_class::value);
    //return rai_class::value;
}

int main()
{
    std::cout << test_rai_hash_implemented() << "\n";
    return 0;
}

如果没有优化,它将产生链接错误“对rai_class :: value的未定义引用”。

使用-O2可以正常工作。有什么想法吗?

查看更多

提问者
Rai
被浏览
9
Jarod42 2020-01-31 22:56

rai_class::value是ODR使用的(通过const T& success),因此需要定义。

bool const rai_class::value;

演示版

或使用constexprinline自C ++ 17起隐式

class rai_class {
public:
    static bool constexpr value = true;
};

演示版