RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 790459
Accepted
Jens
Jens
Asked:2020-02-26 18:38:20 +0000 UTC2020-02-26 18:38:20 +0000 UTC 2020-02-26 18:38:20 +0000 UTC

在 SFINAE 中为具有完美转发的构造函数使用什么类型的关系?

  • 772

与 SFINAE 中的类型检查有些混淆。假设有:

class Foo
{
public:
    std::string member;
    std::string member2;

    template <
        typename T, // Parameter 1.
        typename U, // Parameter 2.
        typename Enable = typename std::enable_if <
        std::is_constructible<std::string, T>::value &&
        std::is_constructible<std::string, U>::value>::type>
    Foo(T&& member, U&& member2) :
        member{std::forward<T>(member)},
        member2{std::forward<U>(member2)}
    {}
};

我不明白该使用什么,std::is_constructible或者std::is_convertible?std::is_same关于后者,据我了解,给我们提供了一个艰难的巧合,我们std::decay只能添加更多。但是,我想使用 C 数组或例如通过std::initializer_list. 我std::is_convertible知道它会跳过,例如,转换float为int,但在这段代码中:

template<class D>
    impl_ptr(pointer p, D&& d,
             typename std::enable_if<
                std::is_convertible<D, deleter_type>::value,
                dummy_t_
             >::type = dummy_t_()) noexcept
    : ptr_(std::move(p), std::forward<D>(d)) {}

被使用(这个例子是一个智能指针构造函数,用于实现 pimpl,D并且deleter_type是删除器,ptr_类型为std::unique_ptr)。

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    AnT stands with Russia
    2020-02-26T23:01:03Z2020-02-26T23:01:03Z

    std::is_convertible意味着完全且仅隐式转换,所有附带的限制都强加于隐式转换。它不会考虑转换构造函数和标记为的转换运算符explicit。它不会在一个转换序列中执行一个以上的自定义转换。

    std::is_constructible直接考虑构造函数,不管它们是否被标记为explicit.

    T a(b)也就是这里的划分明确了,【大致】对应了直接初始化和拷贝初始化的区别T a = b。即使在 C++17 中,这些初始化形式之间的差异也不限于explicit.

    选择您的情况所需的确切内容。

    您现在有了is_constructible,它实际上提取了所有构造函数std::string,包括分配器中的构造。你需要这样的机会吗?我怀疑最初的意图是只允许构造各种字符串。然后再合适不过了is_convertible。

    • 2
  2. Ariox
    2020-02-26T20:19:37Z2020-02-26T20:19:37Z

    在这种情况下,最好使用std::is_constructible,因为您将参数传递给构造函数,这意味着您需要检查给定参数的构造函数是否存在。

    但是对于给出的具体示例,最好使用 string_view (如果可用),或者按值接受接收器并通过std::move. 模板实现选项带来的问题多于其价值。

    而std::is_convertible对于智能指针中的deleter,使用它是因为deleter可以是lambda,隐式转换为函数指针,但函数指针不是直接从lambda构造的。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5