我正在学习c ++.我想让编译器将nullptr推导为shared_ptr.请阅读以下代码,
struct A {};
struct B {
std::shared_ptr<A> a;
};
struct Tag {
std::shared_ptr<B> b;
};
auto GetSharedPtrClassB(Tag* tag) {
if (tag) {
auto& sharedB = *(tag->b);
return sharedB.a;
} else {
return nullptr; // Error : compiler cannot deduce type of nullptr.
}
}
Run Code Online (Sandbox Code Playgroud)
在GetSharedPtrClassB,nullptr不能推断为std::shared_ptr<A>.错误消息如下,
error: inconsistent deduction for ‘auto’: ‘std::shared_ptr<A>’ and then ‘std::nullptr_t’
Run Code Online (Sandbox Code Playgroud)
我怎样才能让编译器推导出nullptr为std::shared_ptr<A>?我可以提供一种类型decltype(*(tag->b)),但我想不出提供类型的下一步std::shared_ptr<A>.
非常感谢你.
使用条件运算符强制转换nullptr为"any":
auto GetSharedPtrClassB(Tag* tag) {
return tag ? tag->b->a : nullptr;
}
Run Code Online (Sandbox Code Playgroud)
在条件运算符中从一个操作数到另一个操作数的转换是明确定义的(参见[expr.cond]),这里nullptr将转换为类型的对象decltype(tag->b->a).
另一方面,在auto没有尾随返回类型的情况下使用返回类型推导的规则非常严格 - 每个return语句的推导类型必须相同([dcl.spec.auto/9]):
如果具有包含占位符类型的声明返回类型的函数具有多个return语句,则会为每个return语句推导出返回类型.如果推断的类型在每次扣除中不相同,则该程序是不正确的.
如果您的函数不能简化为条件运算符,则可以使用尾随返回类型:
auto GetSharedPtrClassB(Tag* tag) -> decltype(tag->b->a) {
if (tag) {
auto& sharedB = *(tag->b);
return sharedB.a;
} else {
return {};
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |