#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); ^
编译失败。
答案 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
});
几乎没有意义。