我们如何使用其默认参数编码必须为非常量的别名参数,因为它不能引用,因此必须为常量?并且必须没有过载功能,因为它的91行长
Bar {
int on;
Bar(){};
Bar(bool o): off{o}{}
bool off;
}
int fooBar(int board, Bar& bar = static_cast<Bar>(1)) {
//...
}
gcc给了
错误:无法将'Bar&'类型的非常量左值引用绑定到'Bar'类型的右值
如何解决-有明确的解释-这样的人?
您发现此错误的原因是,您已经发现,非const
引用必须绑定到左值:也就是说,它必须绑定到具有名称的对象。临时文件不会绑定到非const
引用:仅绑定到const Bar&
或Bar&&
,而您都不想要。
这给我们几个选择。
我个人最喜欢的是根本不使用默认参数,而要提供重载:
int fooBar(int board, Bar& bar) { // ... } int fooBar(int board) { // to save code duplication you can call in fooBar Bar b{1}; return fooBar(board, b); }
我认为这是最简单,最一致的选择。
其他可能性包括:
inline Bar default_bar;
int fooBar(int board, Bar& bar = default_bar) {
// ...
}
int fooBar(int board, Bar* bar = nullptr) {
// ..., but make sure to test bar!
}
std::optional<std::reference_wrapper<Bar>>
或类似类型。