显式c ++关键字:这段代码出了什么问题?

时间:2017-06-09 15:52:33

标签: c++ compiler-errors explicit

#include <bits/stdc++.h>
using namespace std;
class A {
    int x;
public:
    class B {
    public:
        int y;
        B(int _y) : y(_y) {}
        explicit operator A() const {
            return A(y);
        }
    };
    explicit A (int _x) : x(_x) {}
    explicit A (const A& o) : x(o.x) {} 
};
typedef unsigned int size_type;
int main () { 
    return 0;
}
  

错误:g ++ -Wall -I./ -I / home / abdelrahman / main-repo / -o&#34; testt&#34;   &#34; testt.cpp&#34; (在目录中:/ home / abdelrahman / Desktop)

     

testt.cpp:In   成员函数'A :: B ::运算符A()const':testt.cpp:11:14:错误:否   调用'A :: A(A)'的匹配函数       返回A(y);                 ^

     

编译失败。

1 个答案:

答案 0 :(得分:1)

将拷贝构造函数标记为显式意味着不允许编译器隐式使用它,这就是函数返回时发生的情况 - 当返回值有隐式使用拷贝构造函数时被复制“出于”函数。

传递参数时会发生同样的情况 - 编译器隐式使用复制构造函数来创建参数。

以下是一个最小的例子,由于这些原因而失败:

class A
{
public:
    A(){}
    explicit A(const A&){}
};

void g(A a)
{

}

A f()
{
    A a;
    return a; // Fails; no suitable constructor
}

int main()
{
    A a;
    g(a); // Fails; no suitable constructor
}

您可以制作的唯一副本是显式副本 - 源代码明确复制对象的副本,例如

A a;
A b(a);  // Succeeds because this is an explicit copy.
除了转换构造函数之外,在explicit上使用var image = { url: 'map_marker.png', scaledSize : new google.maps.Size(50, 50), }; // Let's also add a marker while we're at it var marker = new google.maps.Marker({ position: new google.maps.LatLng(51.524110, -0.073897), map: map, title: 'Snazzy!', icon: image }); 几乎没有意义。