摘要: MSVC 2013 是否有权在代码段之后拒绝此 MCVE,即使它以不太理想的方式这样做?
- MSVC 2013,更新 5
- 海合会 5.2.0
- 铿锵声 3.7.0
在尝试创建类型特征以检查从单个其他类型构造一种类型的大括号的有效性时
B b;
A{b}; // <-- whether this line would be valid code
它在 MSVC2013 中通过调整此答案中的代码来尝试解决 MSVC 缺乏表达式 SFINAE 支持的问题。我一直在收到:
错误 C1001:编译器发生内部错误。
与位置
编译器文件'f:\dd\vctools\compiler\cxxfe\sl\p1\c\cast.c',第 725 行
下面的 MCVE 会触发此 ICE,即使在 /Od 下也是如此:
#include <utility>
#include <type_traits>
template <typename Type, typename Arg, typename = void>
struct isBraceConsructibleImpl
: public std::false_type{};
template <typename Type, typename Arg>
struct isBraceConsructibleImpl<Type, Arg, decltype((void)Type{ std::declval<Arg>() }) >
: public std::true_type{};
int main(int, char**){}
正如在coliru上所见,gcc 和 clang 都很好(即使在 -O2 下)。然而,虽然 ICE 肯定是 MSVC 中的一个错误,但 gcc 和 clang 都接受所述代码并不能保证它最终是有效的代码。
Arg
从模板中删除并替换Arg
declval 中的int
不会重现错误:
#include <utility>
#include <type_traits>
template <typename Type, typename = void>
struct isBraceConsructibleImpl
: public std::false_type{};
template <typename Type>
struct isBraceConsructibleImpl<Type, decltype((void)Type{ std::declval<int>() }) >
: public std::true_type{};
int main(int, char**){}
并且 gcc 和 clang再次很好。
MSVC 是否正在从有效代码生成 ICE?