Задача 1
Правила для auto
ссылок на типовые вычеты. Следовательно, тип возврата вашей лямбды выводится как Foo
вместо Foo&
, который затем требует копию. Если вы хотите вернуть ссылку из лямбды, вы должны указать это явно, используя конечный синтаксис возвращаемого типа, либо явно указав тип возвращаемого значения Foo&
, используя auto&
для принудительного вывода ссылочного типа, либо используя decltype(auto)
, который сохраняет ссылки. См. ссылка , ссылка , ссылка , в последней ссылке соответствующая часть: «Если P является ссылочным типом, используется тип, на который ссылается P для вычета. "
[this]() {return this->fake_accessor_.GetFoo();} // Returns Foo
[this]() -> Foo& {return this->fake_accessor_.GetFoo();} // Returns Foo&
[this]() -> auto {return this->fake_accessor_.GetFoo();} // Returns Foo
[this]() -> auto& {return this->fake_accessor_.GetFoo();} // Returns Foo&
[this]() -> decltype(auto) {return this->fake_accessor_.GetFoo();} // Returns Foo&
Таким образом, вы должны изменить лямбда, которую вы передаете, на ON_CALL
, чтобы вернуть тип ссылки, например:
ON_CALL(*this, GetFoo).WillByDefault([this]() -> Foo& {
return this->fake_accessor_.GetFoo();
});
ON_CALL(*this, GetBar).WillByDefault([this]() -> Bar const& {
return this->fake_accessor_.GetBar();
});
Без этого вы получите ошибки:
test.cpp:83:20: error: call to deleted constructor of 'Accessor::Foo'
return this->fake_accessor_.GetFoo();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:26:9: note: 'Foo' has been explicitly marked deleted here
Foo(Foo const&) = delete;
^
test.cpp:82:46: error: no viable conversion from '(lambda at test.cpp:82:46)' to 'const Action<Accessor::Foo &()>'
ON_CALL(*this, GetFoo).WillByDefault([this]() {
^~~~~~~~~~
Задача 2
В вашем объявлении GetBar
у вас есть два использования const
:
- Функция является
const
функция-член (то есть она не может изменять состояние this
). - Возвращаемое значение является ссылкой на
const Bar
.
Макрос MOCK_CONST_METHOD0
только объявляет const
функция-член. Чтобы покрыть const
в возвращаемом значении, ваш макет должен быть:
MOCK_CONST_METHOD0(GetBar, Bar const&());
Без этого изменения будет сгенерирована следующая ошибка:
test.cpp:86:46: error: no viable conversion from '(lambda at test.cpp:86:46)' to 'const Action<Accessor::Bar &()>'
ON_CALL(*this, GetBar).WillByDefault([this]() -> Bar const& {
^~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/gmock/gmock-actions.h:357:7: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from '(lambda at test.cpp:86:46)' to 'const testing::Action<Accessor::Bar &()> &' for 1st argument
class Action {