C++ 为什么std::u可构造性在即时上下文中停止?

C++ 为什么std::u可构造性在即时上下文中停止?,c++,language-lawyer,c++14,template-meta-programming,typetraits,C++,Language Lawyer,C++14,Template Meta Programming,Typetraits,源于主题。也与此有关 我的问题是为什么std::is_constructible在直接上下文中停止?我认为std::is_constructible的用户会期望它能够深入地工作并给出准确的答案。有了这个即时上下文,您可能会有std::is_constructible给您开绿灯,但实际执行时却会遇到一个硬编译器错误。这是否违背了std::is_constructible的最初目标和目的。现在,我觉得它基本上没用。我想对于当前的语义来说,std::looks\u constructible\u at

源于主题。也与此有关


我的问题是为什么
std::is_constructible
在直接上下文中停止?我认为
std::is_constructible
的用户会期望它能够深入地工作并给出准确的答案。有了这个即时上下文,您可能会有
std::is_constructible
给您开绿灯,但实际执行时却会遇到一个硬编译器错误。这是否违背了std::is_constructible的最初目标和目的。现在,我觉得它基本上没用。我想对于当前的语义来说,
std::looks\u constructible\u at \u first sight
应该是一个更好的名称:(

如果构造函数的签名远比它应该允许的多,这就是问题所在-而不是
是可构造的
的实现。在您最初的示例中

template <typename... Ts, typename=decltype(base{std::declval<Ts>()...})>
aggregate_wrapper(Ts&&... xs)
    : base{std::forward<Ts>(xs)...} {/*…*/}
模板
聚合包装(Ts&…xs)
:base{std::forward(xs)…}{/*…*/}
做这个工作。如果
是可构造的
“虚假”给出了绿灯,那么你的构造函数模板可能会被虚假地选择而不是其他构造函数,因为重载解析发现它是最佳匹配

然而,重载解析并不是为了只给出真正的否定/肯定值而设计的:它是为了在给定适当参数的情况下找到最佳匹配,或者在参数足够不合适的情况下不产生任何结果。
是可构造的
在某种意义上可能是肤浅的,但这就是检查信号的特征res是实体在重载解析和SFINAE领域中的表示形式,它并不能阻止函数模板接受所有内容,而只能为一小部分参数进行可靠的实例化。

这是你的责任,如果你能做到这一点,你将从
is\u constructible
和高效编译中获得正确的结果。这肯定比
is\u constructible
的持久操作和在函数模板调用中使用大量隐藏规则的高编译时间要好。

它减少到是NP难的。@erip Wow~所以,基本上不是我们不想这样做,而是我们这里有一个技术问题?但我认为简单的SFINAE就可以完成这项工作。不?SFINAE也会在直接上下文中停止。@t.C.但最终,编译器将进行全面的工作,并给出准确的答案。我们能利用这个事实吗?首先,你可能会我不希望重载解析“在全深度工作”。编译时间会飞涨。其次,现有的实现可能无法从实例化堆栈深处的错误中正常恢复。只需看看MSVC与表达式SFINAE的斗争。
base{std::declval()…}
是否等同于
base{std::forward(std::declval())…}
?@Lingxi是。
declval
返回
add\u-rvalue\u-reference
,它产生的类型与(检查其返回类型!)完全相同。我不知道您的代码段来自何处,但这解决了我的问题!谢谢!