constexprの挙動について
Visual Studio 2019を用いてenumを管理するようなプログラムをC++14で書いたのですが、constexprとそうでないものの結果が異なり困っています。なお、Wandboxを使ってGCCとClangで試してみたところ、結果は同じ(どちらも1)でした。
実行時のデバッグでは正しい値が帰ってくるのですが、肝心なコンパイル時にどういう挙動をしているかをのぞけないため、解決できずに質問した次第です。
解決策等ご教示いただけると幸いです。
該当のソースコード
タイムアウトしたためリンクが変更されています。また、期間を延ばしました
*** ヘッダファイル側:Pastebin ***
cpp
1enum class test 2{ 3 v0, v1, v2, v4 = 4, v8 = 8, v16 = 16, v32 = 32 4}; 5ENUM2_ENUM(test) 6constexpr inline decltype(auto) get_flags(test) noexcept 7{ 8 using enum2::blk; 9 return enum2::blk_cat( 10 blk(test::v1, 100, test::v2, test::v4, test::v32), //test::v1とtest::v2,test::v4,test::v32は共存できない 11 blk(enum2::force_or(test::v2, test::v4), 100, false, test::v8),//test::v2とtest::test::v4はtest::v8と共存できない 12 blk(enum2::force_or(test::v16, test::v2), 100, test::v32) //(test::v16|test::v2)はtest::v32とは共存できない 13 ); 14} 15#include <iostream> 16 17int main() 18{ 19 constexpr test v0 = test::v0 | test::v1 | test::v2; //3 20 test v1 = test::v0 | test::v1 | test::v2; //1 21 22 std::cout << static_cast<int>(v0) << static_cast<int>(v1); 23 24 return 0; 25}
MSVCの情報
Microsoft Visual Studio Community 2019
Version 16.2.3
VisualStudio.16.Release/16.2.3+29215.179
Microsoft .NET Framework
Version 4.7.03062
インストールされているバージョン:Community
Visual C++ 2019 00435-60000-00000-AA041
Microsoft Visual C++ 2019
(以下略)
###追記
「結果が異なる」のはconstexpr側では結果が3、そうでない側では1(意図した結果)になります。
###追記2
pastebinのリンクがタイムアウトしてしまった(一日経過してしまった)ので更新しました。
回答2件
あなたの回答
tips
プレビュー