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

灯泡

我碰到了有关此显式复制构造函数问题的墙。我一直在写一个类来弄清楚事情:

#include <iostream>

template<class T>
class Mat
{
private:
    T data;
public:
    void set(T value)
    {
        data = value;
    }

    Mat()
        : data(T(0))
    {
    }

    explicit Mat(const Mat& another)
    {
        *this = another;
    }

    Mat& operator=(const Mat& another)
    {
        data = another.data;
        return *this;
    }

    template<class U>
    explicit operator Mat<U>()
    {
        Mat<U> result;
        result.set(static_cast<U>(data));
        return result;
    }

    void print()
    {
        std::cout << data << std::endl;
    }
};


int main()
{
    Mat< double > d1;
    d1.set(3.14159);
    Mat< int > i1(static_cast<Mat<int>>(d1));
    d1.print();
    i1.print();

    std::cin.sync();
    std::cin.ignore();
    return 0;
}

我希望我的副本构造函数仅接受另一个对象的显式转换后的实例,因此我将其声明为显式的,但现在出现错误错误“ C2558:类'Mat':没有可用的副本构造函数或副本构造函数被声明为'explicit'”,即使我做了一个明确的演员表:

static_cast<Mat<int>>(d1)

我已经声明了复制构造函数是明确的,因为我希望这是非法的:

Mat<float> a;
Mat<int>   b(a);

同时,我希望以下内容保持合法:

Mat<float> a;
Mat<int>   b(static_cast<Mat<int>>(a));

编辑:我一直在尝试修改这些概念,试图确切地定义我想要得到的东西,而且我似乎得到了一些有趣的结果:

#include <iostream>

class MatB
{
private:
    float data;
public:
    MatB()
        :data(0.0f)
    {

    }

    void set(float value)
    {
        data = value;
    }

    float getData() const
    {
        return data;
    }

    void print()
    {
        std::cout << data << std::endl;
    }
};

class MatA
{
private:
    double data;
public:


    MatA()
        :data(0.0)
    {

    }

    void set(double value)
    {
        data = value;
    }

    double getData() const
    {
        return data;
    }

    explicit operator MatB()
    {
        MatB temp;
        temp.set(static_cast<float>(getData()));
        return temp;
    }

    void print()
    {
        std::cout << data << std::endl;
    }
};



class MatC
{
private: 
    int data;
public:

    MatC()
        :data(0)
    {

    }

    explicit MatC(const MatB& in)
        :data(static_cast<int>(in.getData()))
    {

    }

    void print()
    {
        std::cout << data << std::endl;
    }
};

int main()
{
    MatA someA;
    someA.set(3.14159);
    MatC constructCFromA(someA);
    someA.print();
    constructCFromA.print();

    std::cin.sync();
    std::cin.ignore();
    return 0;
}

在此示例中,constructCFromA(someA)不应编译(imo)-即使链接程序将其标记为错误(VS2013),也仍然可以编译...我不确定我对“显式”的理解是否不正确, IDE是否将其错误地标记为错误,还是编译器将其编译为正确的错误。我以为我需要做这样的事情:

constructCFromA(static_cast<MatB>(someA));

IDE似乎同意我的观点,但是编译器不同意。我必须说我很困惑。

EDIT2:没关系,在Ideone中它不会编译,所以我想MS应该负责。我认为第二个代码很好地说明了我想要得到的行为。基本上将初始化和分配时的非显式转换设为非法。但是,使复制构造函数显式出现似乎有各种“副作用”。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

您进行显式强制转换的行不是问题。导致编译问题的问题在Mat<U>按值返回的行上

template<class U>
explicit operator Mat<U>()
{
    Mat<U> result;
    result.set(static_cast<U>(data));
    return result;  // <<== This line requires a copy constructor to be defined
}

这就是为什么当您explicit在复制ctor之前删除时,您的代码可以正常工作的原因。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

具有显式调用的C#构造函数歧义-错误CS0012

来自分类Dev

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

来自分类Dev

C++显式实例化非模板类的模板构造函数

来自分类Dev

复制/移动省略与显式删除的复制/移动构造函数

来自分类Dev

C ++中的复制构造函数

来自分类Dev

C ++中的复制构造函数

来自分类Dev

显式复制构造函数和std :: sort

来自分类Dev

显式复制构造函数调用语法

来自分类Dev

C ++隐式复制和移动构造函数背后的基本原理?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

    具有显式调用的C#构造函数歧义-错误CS0012

  21. 21

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

  22. 22

    C++显式实例化非模板类的模板构造函数

  23. 23

    复制/移动省略与显式删除的复制/移动构造函数

  24. 24

    C ++中的复制构造函数

  25. 25

    C ++中的复制构造函数

  26. 26

    显式复制构造函数和std :: sort

  27. 27

    显式复制构造函数调用语法

  28. 28

    C ++隐式复制和移动构造函数背后的基本原理?

  29. 29

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

热门标签

归档