为什么 shared_ptr 在函数中返回时不隐式转换为布尔值?

Why isn't shared_ptr implicitly converted to boolean when returning it in a function?

以下将无法编译:

#include <memory>
class A;
bool f() {
    std::shared_ptr<A> a;
    return a;
}

int main()
{
    f();
    return 0;
}

并失败:

Compilation failed due to following error(s).main.cpp: In function ‘bool f()’:
main.cpp:13:12: error: cannot convert ‘std::shared_ptr’ to ‘bool’ in return
     return a;

标准(我推测)不允许此处隐式转换的原因是什么?

因为将 std::shared_ptr 转换为 booluser-defined operatorexplicit:

explicit operator bool() const noexcept;

请注意,在 if 语句的条件下到 bool 的隐式转换 – – 即使使用 explicit 仍然会发生用户定义的转换运算符到 bool :

std::shared_ptr<int> ptr;

if (ptr) { // <-- implicit conversion to bool

}

也就是说,你不需要在if语句的条件中写static_cast<bool>(ptr)