类实例化语法
Class instantiation syntax
我一直被教导
1. Class c(arg);
和
2. Class c = arg;
是两个完全等价的语句,但看看这种情况。
#include <iostream>
class Intermediary {
};
class Left {
public:
Left(const Intermediary &) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
class Right {
public:
// The argument is there just so that the example can work, see below
Right(int) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
operator Intermediary () const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return Intermediary();
}
};
现在,如果我这样做:
Left l = Right(0);
编译器将抱怨
error: conversion from Right to non-scalar type Left requested
但如果我这样做:
Left l(Right(0));
然后一切都编译了,输出就是
Right::Right(int)
Right::operator Intermediary() const
Left::Left(const Intermediary&)
然而,如果我这样做:
Left l = (Intermediary)Right(0);
然后所有内容都重新编译,输出与上面的一样。
很明显
1. Class c(arg);
和
2. Class c = arg;
不一样,但为什么不一样,有什么区别?我在网上找不到这方面的任何信息。
我一直被教导
Class c(arg);
和Class c = arg;
是两个完全等价的语句,但看看这种情况。
事实证明,它们并不等价。第一个从arg
构造Class c
,而第二个从arg
构造Class
,然后从中复制构造Class c
。请注意,该实现允许省略该副本,而且通常是这样。
Left l = Right(0);
这需要从Right
到Intermediary
的转换,以及从Intermediary
到Left
的转换。这两个顺序的用户定义转换是标准不允许的,您必须像使用一样至少显式地执行其中一个转换:
Left l = (Intermediary)Right(0);
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++ 实例化派生类的语法异常
- 未知的 C++ 对象实例化语法
- (C++)用于实例化新对象并将其分配给指向相同对象类型的指针的 2D 向量的语法
- 使用大括号初始化列表或传统的 ctor 语法实例化类型
- 创建实例化类数组 - 语法
- 类实例化语法
- C++中对象实例化的语法是什么