我的问题是为什么std::is_constructible
会在紧邻情况下停止?我认为std::is_constructible
的用户希望它能够全面深入地工作并给出确切的答案。有了这个直接的上下文,你可能会std::is_constructible
给你一个绿灯,只是为了在你真正做到这一点时遇到硬编译器错误。这不会破坏std::is_constructible
的原始目标和目的。现在,它对我来说基本上看起来毫无用处。我想std::looks_constructible_at_first_sight
对于当前的语义来说是一个更好的名称:(
答案 0 :(得分:1)
如果构造函数的签名比它应该更宽松,那么 就是问题 - 而不是is_constructible
的实现。在您的原始示例中,
template <typename... Ts, typename=decltype(base{std::declval<Ts>()...})>
aggregate_wrapper(Ts&&... xs)
: base{std::forward<Ts>(xs)...} {/*…*/}
完成这项工作。如果is_constructible
“spuriously”发出绿灯,那么你的构造函数模板可能会被虚假地选择而不是其他构造函数,因为重载决策会发现它是最佳匹配。
然而,重载决策并非旨在仅给出真正的否定/肯定:它旨在找到给定适当参数的最佳匹配,或者如果参数足够不合适则不产生任何效果。 is_constructible
在某种意义上可能是肤浅的,但这就是特征所在 - 检查签名,这是一个实体在重载决策和SFINAE领域的表示 - 不会阻止你的函数模板接受所有东西,只是实际上实际实例化了一小部分争论
这是你的责任,如果你遇到它,你将从is_constructible
得到适当的结果并进行有效的编译。这绝对比调用函数模板时具有众多隐藏规则的is_constructible
和高编译时间的可靠操作更好。