c++ - 为什么 std::is_constructible 在直接上下文中停止?

标签 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 是当前语义的更好名称 :(

最佳答案

如果构造函数的签名比应有的宽松得多,就是问题所在 - 而不是 is_constructible 的实现。在您的原始示例中,

template <typename... Ts, typename=decltype(base{std::declval<Ts>()...})>
aggregate_wrapper(Ts&&... xs)
    : base{std::forward<Ts>(xs)...} {/*…*/}

完成任务。如果 is_constructible“虚假地”亮起绿灯,那么您的构造函数模板可能会被虚假地选择,而不是其他构造函数,因为重载解析发现它是最佳匹配。

但是,重载决策并非旨在只给出真正的否定/肯定:它旨在找到给定适当参数的最佳匹配,或者如果参数非常不合适则不产生任何结果。 is_constructible 在某种意义上可能是肤浅的,但这就是特征的用途 - 检查签名,这是一个实体在重载决议和 SFINAE 领域的表示 - 不阻止你的函数模板接受一切但实际上合理地实例化一小部分参数。
这是你的责任,如果你满足了,你将从 is_constructible 和高效编译中得到正确的结果。这绝对比 is_constructible 的可靠运行和在函数模板调用中具有大量隐藏规则的高编译时间要好。

关于c++ - 为什么 std::is_constructible 在直接上下文中停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35006185/

相关文章:

c++ - 为什么一个方法会对同一个变量有 const 和非 const 参数?

c++ - 通用引用的标准/官方名称是什么?

C++:输入验证器函数

c++ - 是否可以通过访问 USB 设备为三星智能电视编写 C++ 应用程序

c++ - 我的 C++ 列表迭代器是在改变位置,还是我做错了什么?

C++ 级联类型转换

c++ - 模块接口(interface)中的内联含义

c++ - 'auto t = new decltype(nullptr)' 是做什么的?

c - 我怎样才能让 gcc 预处理器检查一个表达式的计算结果是一个值还是什么都没有?

c++ - boost::spirit qi::uint_有效数字范围