gpt4 book ai didi

c++ - 我怎样才能让编译器推断出一种 nullptr?

转载 作者:太空狗 更新时间:2023-10-29 19:40:13 25 4
gpt4 key购买 nike

我正在学习 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.
}
}

GetSharedPtrClassB , nullptr不能推断为 std::shared_ptr<A> .错误信息如下,

error: inconsistent deduction for ‘auto’: ‘std::shared_ptr<A>’ and then ‘std::nullptr_t’

我怎样才能让编译器将 nullptr 推断为 std::shared_ptr<A> ? 我可以提供类型 decltype(*(tag->b)) ,但我想不出下一步提供类型 std::shared_ptr<A> .

非常感谢。

最佳答案

使用条件运算符强制从 nullptr 转换为“whatever”:

auto GetSharedPtrClassB(Tag* tag) {
return tag ? tag->b->a : nullptr;
}

在条件运算符中从一个操作数到另一个操作数的转换是明确定义的(参见 [expr.cond]),此处 nullptr 被转换为一个对象输入 decltype(tag->b->a)

另一方面,当使用没有尾随返回类型的 auto 时,返回类型推导规则非常严格 - 每个 return 的推导类型必须相同声明([dcl.spec.auto/9]):

If a function with a declared return type that contains a placeholder type has multiple return statements, the return type is deduced for each return statement. If the type deduced is not the same in each deduction, the program is ill-formed.


如果您的函数不能简化为条件运算符,您可以使用尾随返回类型:

auto GetSharedPtrClassB(Tag* tag) -> decltype(tag->b->a) {
if (tag) {
auto& sharedB = *(tag->b);
return sharedB.a;
} else {
return {};
}
}

关于c++ - 我怎样才能让编译器推断出一种 nullptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44501629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com