🌟
MSVC + std::shared_ptr で false が通ってしまう
std::shared_ptr<int> myfun() {
return false;
}
int main() {
std::shared_ptr<int> a = myfun();
if(!a) {
std::puts("bora");
}
}
MSVC だとコンパイルが通る. clang/gcc だと
could not convert ‘false’ from ‘bool’ to ‘std::shared_ptr<int>' ...
とエラーが出る.
return 0 とすると両方でコンパイルが通る.
MSVC は false を 0 で定義しているため?
理想は?
nullptr がよいようであるが, なんかややこしい... 0 がよかったりするんじゃろか?
Discussion
手元で試したところ Visual Studio 2019 のビルドツールである MSVC v142 からは適切にエラーとなるようです
それ以前のビルドツールでは
std::nullptr_tがfalseから変換できてしまったためにコンパイルが通っていましたありがとうございます!
compiler explorer では MSVC v19(VS2024?)でもコンパイルできていました...
いずれにせよ false はよくなくて, 理想は
nullptrでしょうか..どうコードを書くべきかという観点のお話でしたら、暗黙のオブジェクト構築に依存せずに、
デフォルトコンストラクターで空のスマートポインタを返すのが明確で良いのではないかと思います。
Move Semantics なり、Return Value Optimization なりで、
問題になるようなレベルの性能劣化は怒らないと思います。
何度も長い型名をタイプしたくないということでしたら、
autoを使って逃げる手もありますね。型の間違いチェックのために明示したい事とのトレードオフですが。
なるほど! ありがとうございます!
MSVCでのC++17指定のコンパイラオプションは
-std=c++17ではなく-std:c++17ですねMSVC だと
/std:c++17ですね. 結果は同じ(コンパイルは通る)でした-と/は互換性のためどちらでも同じですが、確かにc++17でも通りますね。c++20だとエラーになりました。なんと! C++20 で厳格になったのかしらん?