c – SFINAE和noexcept说明符
在功能模板的重载解析过程中,noexcept说明符括号中的表达式是否参与SFINAE?
我想为聚合创建一个包装器,并希望std :: is_constructible谓词正常工作: template< typename type > struct embrace : type { template< typename ...arguments > embrace(arguments &&... _arguments) noexcept(noexcept(type{std::forward< arguments >(_arguments)...})) : type{std::forward< arguments >(_arguments)...} // braces { ; } }; int main() { struct S { int i; double j; }; // aggregate using E = embrace< S >; E b(1,1.0); // "parentheses"-constructible => can be used as usual types b.i = 1; b.j = 2.0; // accessible static_assert(std::is_constructible< E,int,double >{}); static_assert(std::is_constructible< E,struct B >{}); // want hard error here return EXIT_SUCCESS; } 但是我尝试在noexcept规范中使用noexcept操作符来启用SFINAE失败,并且模板构造函数接受传递给它的所有内容.构造函数如何被限制? 标准不允许专门从< type_traits> ;.的任何谓词.如何处理接受可变模板参数包和SFINAE的转换器?是否有僵局和固有的语言缺陷? 解决方法
SFINAE根本不适用于异常规范,无论是否是功能类型的一部分.
见[temp.deduct] / 7中的注释:
P0012R1 didn’t change anything在这方面. Piotr的答案涵盖了您的代码的修复. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |