我在VS2015预览中尝试了代码时遇到了这个问题。似乎MSVC在评估noexcept表达式时遇到问题并导致下面的错误消息。我通过将noexcept表达式提升到一个将结果传递给继承的integral_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, "");
}
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:期待'&gt;'终止template-argument-list,找到'&gt;' 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'的声明