次のテストコードがあります。
#include <cstdint>
#include <cassert>
enum class Result : std::uint32_t {SUCCESS = 0, INSUCCESS = 1};
void* func(Result& result)
{
// works great
/*
result = Result::INSUCCESS;
return NULL;
*/
// error: invalid conversion from ‘long int’ to ‘void*’ [-fpermissive]
/*
return result = Result::INSUCCESS, NULL;
*/
// compiles, but <result> is not set???
return result = Result::INSUCCESS, nullptr;
}
void testReturnWithSideEffects()
{
Result result = Result::SUCCESS;
func(result);
assert(result == Result::INSUCCESS);
}
ここには2つの質問がありますが、私は主に2番目に興味があります:
結果が設定されないのはなぜですか?
編集:これを確認してくれてありがとう。私が使用することにした回避策は、次のものを置き換えることです。
return result = Result::INSUCCESS, nullptr;
次のように:
return result = Result::INSUCCESS, (void*)NULL;
追記: もちろん、私の実稼働シナリオは別のポインター型 (void* ではない) を使用していますが、説明のために単純化しました。
別の注意: 回避策から、その nullptr で怪しいことが起こっていることがわかります。コンパイルされないサンプル行は実際にコンパイルされるはずであり、これら2つの問題はおそらく何らかの形で関連していると思います。
そして、私のコードの「トリッキー」または「読みにくい」を概説した人への 3 番目の最後の注意: 読みやすさは主に主観的な問題です。スポット欠陥。