我在 VS2015 预览版中尝试代码时遇到了这个问题。看来 MSVC 在评估 noexcept 表达式时遇到问题,并导致以下错误消息。我通过将 noexcept 表达式提升到将结果传递给继承的 integer_constant 的包装结构中解决了这个问题。
我进行了一些搜索,但找不到任何将其记录为 MSVC 问题的内容。我非常有信心这是可移植的代码,因为 libc++ 将这种模式用于其 type_traits 实现。MSVC 使用编译器内在实现了他们的 type_trait 版本。
好奇在我向 Microsoft 记录错误之前是否有人有任何见解。
#include <type_traits>
using namespace std;
template<typename T, typename... Args>
struct is_nothrow_constructible_custom
: public integral_constant<bool, noexcept(T(declval<Args>()...))>
{};
class A
{
public:
A(int) {}
A(short) noexcept {}
};
int main()
{
static_assert(is_nothrow_constructible_custom<A, int>::value == false, "");
static_assert(is_nothrow_constructible_custom<A, short>::value == true, "");
}
- 查看更多信息:http: //ideone.com/3ggm0E#sthash.Drpe1SbD.dpuf
GCC 4.9 作品:http: //ideone.com/3ggm0E
MSVC:使用 /EHsc /nologo /W4 /c main.cpp main.cpp(7) 编译:错误 C2143:语法错误:在 '...' main.cpp(8) 之前缺少 ')':注意:请参阅参考类模板实例化 'is_nothrow_constructible_custom' 正在编译 main.cpp(7): 错误 C2947: 期望 '>' 终止模板参数列表,发现 '>' main.cpp(7): 错误 C2976: 'std::integral_constant' : 模板参数太少 c:\tools_root\cl\inc\xtr1common(34): 注意: 见 'std::integral_constant' main.cpp(8) 的声明: 错误 C2955: 'std::integral_constant': 使用类模板需要模板参数列表 c:\tools_root\cl\inc\xtr1common(34):注意:参见“std::integral_constant”的声明