C ++显式通用引用构造函数不会隐藏副本构造函数吗?

大卫高

可能我的理解explicit还不够,但是我想知道为什么在以下代码中,当我将通用声明构造函数声明为时,通用构造函数不会将副本构造函数隐藏explicit

struct A
{
    A() = default;

    template<typename T>
    A(T&& t) { std::cout<<"hides copy constructor"<<std::endl; }
};

struct A_explicit
{
    A_explicit() = default;

    template<typename T>
    explicit A_explicit(T&& t) {  std::cout<<"does not hide copy constructor?"<<std::endl; }
};

int main()
{
    A a;
    auto b = a; (void) b;  //prints "hides copy constructor"

    A_explicit a_exp;    
    auto b_exp = a_exp; (void) b_exp; //prints nothing
}

演示

这是一种通用解决方案,而不是SFINAE的解决方案,否则将用于防止隐藏A(例如,通过std::enable_if_t<!std::is_same<std::decay_t<T>, A>::value>,请参见此处)吗?

TC

标记为的构造函数explicit在复制初始化期间(A a = b;等等)不参与重载解析

它确实参与了复制列表初始化(A a = {b1};),并且如果选择该程序,将导致该程序的格式不正确。

...除了括号内的东西是一个A或从中派生的类外,在这种情况下,最近的缺陷报告更改了规则,说在这种特殊情况下将执行复制初始化,因此explicit再次忽略了构造函数完全。

我知道,这很容易教。

这是一种通用解决方案,而不是SFINAE的解决方案,否则将用于防止隐藏在A中吗?

不会。因为该构造函数仍将赢得直接初始化的重载解析:

A_explicit a, b(a); // will call the constructor taking a forwarding reference

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++显式通用引用构造函数不会隐藏副本构造函数吗?

来自分类Dev

C ++ 11隐式副本构造函数,同时显式实现构造函数

来自分类Dev

什么是c ++内联显式构造函数?

来自分类Dev

C ++显式复制构造函数?

来自分类Dev

C++显式构造函数的应用

来自分类Dev

在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

来自分类Dev

C ++隐式和显式继承构造函数调用

来自分类Dev

C ++ 11:默认构造函数:隐式还是显式?

来自分类Dev

链表副本构造函数C ++

来自分类Dev

拦截C ++隐式副本构造函数,或调用其功能

来自分类Dev

C#中的显式构造函数调用

来自分类Dev

C ++显式声明在默认构造函数中触发警告

来自分类Dev

C ++显式构造函数和强制转换

来自分类Dev

C#构造函数引用

来自分类Dev

C ++ 11向量构造函数副本与范围?

来自分类Dev

定义的副本构造函数c ++的默认行为

来自分类Dev

c ++中的副本构造函数如何工作?

来自分类Dev

通过引用从函数调用的C ++构造函数

来自分类Dev

通过引用从函数调用的C ++构造函数

来自分类Dev

根据C ++标准,显式调用构造函数和析构函数是否安全?

来自分类Dev

C ++:派生类隐式调用显式构造函数

来自分类Dev

c ++ 11数组初始化不会调用副本构造函数

来自分类Dev

显式副本构造函数的行为

来自分类Dev

具有显式构造函数的不可复制类型的C ++ 11数组初始化

来自分类Dev

C ++ 11:带“ = {}”的类内初始化不适用于显式构造函数

来自分类Dev

为什么C ++和Java中的构造函数调用需要显式类型参数?

来自分类Dev

如何在C ++中显式实例化模板构造函数?

来自分类Dev

在C ++ 11之前的版本等效于显式删除构造函数(Type(const Type&)= delete;)

来自分类Dev

C ++显式构造函数未阻止从double到int的转换

Related 相关文章

  1. 1

    C ++显式通用引用构造函数不会隐藏副本构造函数吗?

  2. 2

    C ++ 11隐式副本构造函数,同时显式实现构造函数

  3. 3

    什么是c ++内联显式构造函数?

  4. 4

    C ++显式复制构造函数?

  5. 5

    C++显式构造函数的应用

  6. 6

    在C ++中从构造函数中显式地调用析构函数是不好的做法吗?

  7. 7

    C ++隐式和显式继承构造函数调用

  8. 8

    C ++ 11:默认构造函数:隐式还是显式?

  9. 9

    链表副本构造函数C ++

  10. 10

    拦截C ++隐式副本构造函数,或调用其功能

  11. 11

    C#中的显式构造函数调用

  12. 12

    C ++显式声明在默认构造函数中触发警告

  13. 13

    C ++显式构造函数和强制转换

  14. 14

    C#构造函数引用

  15. 15

    C ++ 11向量构造函数副本与范围?

  16. 16

    定义的副本构造函数c ++的默认行为

  17. 17

    c ++中的副本构造函数如何工作?

  18. 18

    通过引用从函数调用的C ++构造函数

  19. 19

    通过引用从函数调用的C ++构造函数

  20. 20

    根据C ++标准,显式调用构造函数和析构函数是否安全?

  21. 21

    C ++:派生类隐式调用显式构造函数

  22. 22

    c ++ 11数组初始化不会调用副本构造函数

  23. 23

    显式副本构造函数的行为

  24. 24

    具有显式构造函数的不可复制类型的C ++ 11数组初始化

  25. 25

    C ++ 11:带“ = {}”的类内初始化不适用于显式构造函数

  26. 26

    为什么C ++和Java中的构造函数调用需要显式类型参数?

  27. 27

    如何在C ++中显式实例化模板构造函数?

  28. 28

    在C ++ 11之前的版本等效于显式删除构造函数(Type(const Type&)= delete;)

  29. 29

    C ++显式构造函数未阻止从double到int的转换

热门标签

归档