以下はVS2015でコンパイルされますが、VS2017では以下のエラーで失敗します。コードがVS2017で修正された何か非標準的なことをしていたのですか、VS2017でコンパイルする必要がありましたか?なぜこのenable_if関数テンプレートはVS2017に特化できないのですか?
#include "stdafx.h"
#include <type_traits>
template <typename E>
constexpr auto ToUnderlying(E e)
{
return static_cast<std::underlying_type_t<E>>(e);
}
template<typename T>
bool constexpr IsFlags(T) { return false; }
template<typename E>
std::enable_if_t<IsFlags(E{}), std::underlying_type_t<E>> operator | (E lhs, E rhs)
{
return ToUnderlying(lhs) | ToUnderlying(rhs);
}
enum class PlantFlags { green = 1, edible = 2, aromatic = 4, frostTolerant = 8, thirsty = 16, growsInSand = 32 };
bool constexpr IsFlags(PlantFlags) { return true; }
int main()
{
auto ored = PlantFlags::green | PlantFlags::frostTolerant;
return 0;
}
エラーは以下のとおりです。
c:\main.cpp(24): error C2893: Failed to specialize function template 'enable_if<false,_Ty>::type
operator |(E,E)'
with
[
_Ty=underlying_type<_Ty>::type
]
c:\main.cpp(24): note: With the following template arguments:
c:\main.cpp(24): note: 'E=PlantFlags'
c:\main.cpp(24): error C2676: binary '|': 'PlantFlags' does not define this operator or a conversion to a type acceptable to the predefined operator
をああ、はい、おかげで私はそれを取り除くでしょう。 –
これは[clangとgccでコンパイル](https://godbolt.org/g/oKUxtQ) – Justin
Visual C++はおそらく間違って 'IsFlags(E {})'が常にfalseであると仮定しています。編集:[私が期待した方法ではないようだ](https://godbolt.org/g/sHS1Dh) – Justin