Это ошибка в GoogleTest AssertionResult? - PullRequest
0 голосов
/ 31 января 2020

Я обрезал макрос EXPECT_TRUE из gtest.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 работает нормально. Есть идеи, что происходит?

1 Ответ

0 голосов
/ 31 января 2020

rai_class::value используется ODR (через const T& success), и поэтому требует определения.

bool const rai_class::value;

Демо

или используйте constexpr (что неявно inline начиная с C ++ 17)

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...