C++ 将std::variant与gmock 1.8对象一起使用时发生编译错误

C++ 将std::variant与gmock 1.8对象一起使用时发生编译错误,c++,c++17,googlemock,std-variant,C++,C++17,Googlemock,Std Variant,让我们使用gmock 1.8编写以下代码: #include "gtest/gtest.h" #include "gmock/gmock.h" #include <variant> class Obj { public: MOCK_METHOD0( mock, void() );//<-!!! }; using Variant = std::variant<Obj>; TEST(Test, Test) { Obj obj; Variant

让我们使用gmock 1.8编写以下代码:

#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include <variant>

class Obj {
  public:
    MOCK_METHOD0( mock, void() );//<-!!!
};

using Variant = std::variant<Obj>;

TEST(Test, Test) {
  Obj obj;
  Variant variant = obj;
}
#包括“gtest/gtest.h”
#包括“gmock/gmock.h”
#包括
Obj类{
公众:

MOCK_METHOD0(MOCK,void());//如果展开
MOCK_METHOD0
宏,将看到它将以下数据成员插入到类定义中:

class Obj
{
public:
    // ...
    mutable ::testing::FunctionMocker<void()> gmock0_mock_12;
};
也就是说,
FunctionMocker
对象是不可复制的,模拟对象也是不可复制的(它们隐式生成的复制构造函数也会被删除)

这是合理的。一个模拟的副本应该有相同的期望吗?它应该再次检查破坏的期望吗

如果要将模拟放在变体中,可以在适当的位置构建它,方法如下:

std::variant<Obj> variant(std::in_place_type_t<Obj>{});
std::variant variant(std::in_place_type_t{});
或:

std::variant;
变体.emplace();

很好,这很有道理,我的问题现在解决了,非常感谢。您是否知道编译器或其他工具会在错误消息中提到Obj类缺少的副本构造函数?
class Obj
{
public:
    // ...
    mutable ::testing::FunctionMocker<void()> gmock0_mock_12;
};
// There is no generally useful and implementable semantics of
// copying a mock object, so copying a mock is usually a user error.
// Thus we disallow copying function mockers.  If the user really
// wants to copy a mock object, they should implement their own copy
// operation, for example:
//
//   class MockFoo : public Foo {
//    public:
//     // Defines a copy constructor explicitly.
//     MockFoo(const MockFoo& src) {}
//     ...
//   };
FunctionMocker(const FunctionMocker&) = delete;
FunctionMocker& operator=(const FunctionMocker&) = delete;
std::variant<Obj> variant(std::in_place_type_t<Obj>{});
std::variant<Obj> variant;
variant.emplace<Obj>();