为什么 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
转换为 bool
的 user-defined operator 是 explicit:
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)
。
以下将无法编译:
#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
转换为 bool
的 user-defined operator 是 explicit:
explicit operator bool() const noexcept;
请注意,在 if
语句的条件下到 bool
的隐式转换 – bool
:
std::shared_ptr<int> ptr;
if (ptr) { // <-- implicit conversion to bool
}
也就是说,你不需要在if
语句的条件中写static_cast<bool>(ptr)
。