为什么std :: is_constructible会立即停止?

时间:2016-01-26 02:37:49

标签: c++ language-lawyer c++14 template-meta-programming typetraits

源自this主题。也与此topic相关。

我的问题是为什么std::is_constructible会在紧邻情况下停止?我认为std::is_constructible的用户希望它能够全面深入地工作并给出确切的答案。有了这个直接的上下文,你可能会std::is_constructible给你一个绿灯,只是为了在你真正做到这一点时遇到硬编译器错误。这不会破坏std::is_constructible的原始目标和目的。现在,它对我来说基本上看起来毫无用处。我想std::looks_constructible_at_first_sight对于当前的语义来说是一个更好的名称:(

1 个答案:

答案 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和高编译时间的可靠操作更好。