关于内置操作符、重载和模板函数

xueweizhong 2003-11-10 04:45:45
加精
前几天看到这里的一个帖子,想回答来着,却已经结贴了。
这里重新提出来,换个角度讨论一下,呵呵:
struct A
{
int m_i;
};
typedef A* A_ptr;

struct B
{
A_ptr m_aptr;
operator A_ptr ()
{
return m_aptr;
}
};

int main()
{
B b;
(*b).i;
^^^^^^^ // ---#1
}

提问的人问#1处发生了什么隐式转换的问题。

下面是我的问题:

这里有几点比较疑惑的地方,提出来大家交流一下:
(1) *b导致operator* 函数的overload resolution
那么编译器是怎么找到合适的operator*的?
(2) 如果内置的operator*用模板实现,是否更合适:
template <typename T>
T& operator *(T*);
(3) 内置的operator *对任何类型T都有
T& operator* (T*); --------#2
函数原型。
但代表无穷多个函数的函数原型#2却并非
函数模板。
(4) (2)和(3)细微差别是什么?
(3)代表着重载,
(2)首先需要模板推导,推导完成后只剩下一个版本。
所以感觉上(2)比较干净。

(5) 一个“不可能的”回答问题:
比如
struct Foo
{
operator int* ();
operator char* ();
operator A_ptr ();
};
Foo foo;
将导致*foo的任何使用都是歧义的。

struct Foo
{
template <typename T>
operator T* ();
};
Foo foo;
A* ptr = *foo; ptr->m_i; 是合法的。
而(*foo).m_i感觉上应该仍旧非法。

...全文
183 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinuxPanther 2003-12-11
  • 打赏
  • 举报
回复
我要保存,可是它要等入。
mufengqing 2003-12-02
  • 打赏
  • 举报
回复
mark
mfcer2 2003-11-28
  • 打赏
  • 举报
回复
mark
aflyinghorse 2003-11-20
  • 打赏
  • 举报
回复
呵呵,你手上的C++编译器还真不少。既然你已经验证过,那就应该没问题。

在C++ Primer15.10这一节有对这个问题的说明。
如果类定义了互相转换的函数,二义性可能会出现。
可以通过显示调用转换函数,解决这种二义性问题
如:Target target = Source().operator target();
xueweizhong 2003-11-20
  • 打赏
  • 举报
回复
>to aflyinghorse() :
我觉得这段陈述中的look for ..., look for ..., then look for ...template ..
应该没有优先级关系。作者应该并不强调这点,只是这么陈述罢了。

而且如果真要说清楚的化,应该说,
如果没有的话..., 同时应该说如果有的话....

现在作者知识就一个例子如此陈述而已。

g++的确接受了这个例子,也的确选择了构造函数。
但是CC,VC, CBC, COMEAUCOMPUTING都否定了,应该没问题。
JerKii 2003-11-19
  • 打赏
  • 举报
回复
还有一种情况的使用可以使我们的程序更具灵活性:
class C {
public:
int m_i;
public:
void testFn(C*);
operator C*(){return this;};
};

void C::testFn(C* ptr){
ptr->m_i = 239;
}

使用:
C c;
c.testFn(c); <<< 该句的调用会自动触发operator C*()的执行,如果没有定义该操作符,则编译出错
c.testFn(&c); << 该句不会执行operator C*()

JerKii
aflyinghorse 2003-11-19
  • 打赏
  • 举报
回复
Item 28 smart pointers:
They look for a single-argument constructor (see Item 5) in the SmartPtr<MusicProduct> class that takes a SmartPtr<Cassette>, but they find none. They look for an implicit type conversion operator in the SmartPtr<Cassette> class that yields a SmartPtr<MusicProduct> class, but that search also fails. They then look for a member function template they can instantiate to yield one of these functions.
aflyinghorse 2003-11-19
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

struct Source;
struct Target
{
Target(){};
Target(Source const &){cout<<"ctor";}; // non-const reference
};

struct Source
{
operator Target()
{cout<<"operator";return Target();};
};


int main()
{
Target target = Source();
getchar();
}
这个程序在dev-cpp4.9.8.4下会有这样的warning: choosing `Source::operator Target()' over `Target::Target(const Source&)'
for conversion from `Source' to `Target'
because conversion sequence for the argument
is better
xueweizhong 2003-11-19
  • 打赏
  • 举报
回复
>to aflyinghorse()
就让我再相信Scott Meyer一下,请告诉我
more effective c++上的哪一条说了这种情况?
xueweizhong 2003-11-19
  • 打赏
  • 举报
回复
>to aflyinghorse()
把你的代码贴一下。

有一种情况下,构造函数将不被考虑:
struct Source;
struct Target
{
Target(Source&); // non-const reference
};

struct Source
{
operator Target () const;
};

Target target = Source();

因为构造函数中的Source&参数不能绑定到r-value, 所以
就只能考虑转换函数了。
aflyinghorse 2003-11-18
  • 打赏
  • 举报
回复
如果同时提供了这两种:
由于这两种都是用户定义转换,不可以进行比较,
我也觉得应该这样。

但我在dev-cpp下试,结果是选择转换函数,而且给出一个警告,意思是说转换函数是比构造函数更好的选择,

而且看more effective c++上说会先考虑单参数构造函数,然后是转换函数。

不知标准怎么定义的,我还是认为如果同时提供了这两种,应该是两个转换一样好,导致编译错误。
Wolf0403 2003-11-16
  • 打赏
  • 举报
回复
郁闷啊。。。被 VC 的语言扩展耍了一把
xueweizhong 2003-11-16
  • 打赏
  • 举报
回复
呵呵,如果同时提供了这两种:
由于这两种都是用户定义转换,不可以进行比较,
将永远导致歧义性。
^^^^
>to Wolf0403(完美废人)
还需要再考虑一下...
Wolf0403 2003-11-16
  • 打赏
  • 举报
回复
转换操作符还是调用了 Target 的构造函数,而且——
Source s;
Target t = s;
如果 Source 提供了转换操作符,编译器优先调用这个转换操作符,结果是比没有这个转换操作符的情况下多生成一个 Target 的临时对象
xueweizhong 2003-11-14
  • 打赏
  • 举报
回复
自定义转换有两种:
1:由构造函数定义:
必须是单参数或者
多参数,但后面的参数都有缺省值:

且构造函数没有explicit修饰符。

struct Target
{
Target(Source src);
// or Target(Source src, Other1 other1=default1, Other2 other2=default2)
};
Source source;
Target target = source;

2: 转换操作符
struct Source
{
operator Target ();
};
Source source;
Target target = source;

第一种转换由Target提供.
第一种转换由Source提供.
laomai 2003-11-14
  • 打赏
  • 举报
回复
请教mmlymlymly(mly) :
user-defined conversion的语法形式是什么?您能给出一个具体的例子吗?

darcymei 2003-11-11
  • 打赏
  • 举报
回复
operator int* ();是重载*操作符吗?不是吧,这是用户定义转化类型
即可将类对象强制转化成int *的操作;
*b在编译器看来是强制转化解引用(不可,因为b不是指针)或强制转化成某种指针,所以就选择强制转换成 A_ptr。
这样的话(5)也很好解释, A* ptr = *foo;编译器会默认调用 (A_ptr),就像int i=double d;
darcymei 2003-11-11
  • 打赏
  • 举报
回复
但是也是有代价的,应该不能是虚拟函数了吧!(上课,来不及了写个试试,感觉不可以)
xueweizhong 2003-11-11
  • 打赏
  • 举报
回复
>to mmly...
呵呵,说到点子上了。
再帮我看看_overload_宏那一贴。

我说明一下,我明白这里发生了什么。

只是想从结果里上探讨一下:
模板函数比函数重载“干净”很多这个东东。
darcymei 2003-11-11
  • 打赏
  • 举报
回复
上面写的有点问题
全局重载operator* 是 return_value_type ::operator * (const A * &);
内部重载operator* 是 return_value_type A::oprator * ();

加载更多回复(9)
"管家婆加密狗读写工具"是一款专门针对管家婆软件的辅助工具,旨在帮助用户进行加密狗的读取和写入操作。加密狗是一种硬件设备,通常用于软件的授权管理,确保只有拥有正确密钥的用户才能运行特定的软件。在IT行业中,这种技术被称为硬件锁或USB Dongle,它通过USB接口连接到计算机,存储了软件的许可证信息。 管家婆软件是一款广泛应用于中小企业财务管理、进销存管理、生产管理等领域的应用软件。它的不同版本可能需要不同的加密狗来验证用户的使用权。"适用于多种版本"表明这款工具兼容管家婆的多个产品版本,为用户提供了一站式的加密狗管理解决方案。 "已测试可用"意味着开发者或提供者已经对这个工具进行了实际的测试,确保它在实际环境中可以正常工作。这是非常重要的,因为它给用户带来了一定程度的信任,表明该工具在使用时不会出现严重的兼容性问题或功能失效。 "要有狗才能用哦"这一提示强调了加密狗是必不可少的,没有加密狗,这个读写工具将无法执行其功能。这意味着用户必须拥有合法的管家婆加密狗才能使用这个工具,否则将无法进行任何读写操作。 从压缩包中的文件名"管家婆写狗(R4ND全集)无壳版.exe"可以看出,这是一个针对管家婆软件的写狗工具,而且是"无壳版"。"无壳版"通常指的是软件去除了保护壳,即没有额外的防逆向工程措施,这可能使工具更易于理解和使用,但同时也可能让软件更容易被破解。"R4ND全集"可能表示这个工具包含了针对各种随机情况的全面支持,比如处理各种类型的加密狗或者各种数据写入需求。 "管家婆加密狗读写工具"是为了解决管家婆软件用户在加密狗管理上的问题而设计的,它具备广泛的版本兼容性,并经过了实际测试,确保功能的稳定性和可靠性。用户需要拥有管家婆的加密狗才能使用此工具进行读写操作,而提供的无壳版本可能方便了用户进行更深入的使用或调试。然而,使用无壳版工具也需谨慎,因为这可能会增加软件被非法利用的风险。
【PA1实验报告1】是关于计算机系统和软件开发的一个实验项目,主要涵盖了以下几个关键知识点: 1. **指令集架构**:实验的目标之一是熟悉指令集的架构。指令集是计算机处理器理解和执行的基本命令集合,它定义了处理器如何处理数据和控制硬件。在这里,虽然可以选择不同的指令集,如RISC-V或x86,但因为实现多个指令集的复杂性,实验选择了x86。x86架构是一种复杂的CISC(复杂指令集计算)架构,包含了大量的单条指令,可以执行多种操作。 2. **图灵机原理**:图灵机是一种理论计算模型,用于描述通用计算能力的极限。在实验中,探究图灵机的运行原理意味着理解其基本操作,包括如何读取和修改存储带上的符号,以及如何根据当前状态和读取的符号来改变状态和移动读写头。 3. **调试器的工作原理**:调试器是软件开发中的重要工具,用于检查和控制程序的执行。实验要求用代码模拟寄存器结构,实现调试器的基本功能。这包括设置断点、单步执行、查看寄存器和内存状态等。调试器的工作原理涉及追踪程序执行流程,中断执行以便分析,并能恢复执行以继续调试。 4. **寄存器结构模拟**:在x86架构中,有不同大小的寄存器,如32位、16位和8位寄存器。实验要求使用`union`结构来模拟这些寄存器,因为`union`可以在同一内存空间中存储不同大小的数据类型,从而反映x86寄存器的共用特性。例如,EAX寄存器可以视为AX、AH和AL的组合。 5. **NEMU模拟器**:NEMU是一个程序模拟器,它的目的是使其他程序能够在NEMU上运行,就像在真实的硬件上一样。实验中提到的`init_monitor()`函数是NEMU启动时调用的关键初始化函数,负责处理参数解析、日志文件初始化、镜像加载和ISA相关的初始化工作。`load_img()`函数用于加载客户程序的镜像,而`init_isa()`则涉及CPU状态的初始化,包括寄存器的设置。 6. **内存管理**:实验中提到了固定内存位置0x10000来加载客户镜像,以及抽象出来的API如`isa_default_img[]`和`isa_default_img_size`,这些API简化了镜像加载和内存管理。 7. **设备初始化**:`init_device()`函数用于初始化设备,这是模拟真实计算机环境的关键部分,因为模拟器需要模拟I/O设备以处理输入输出操作。 8. **断点和监视点**:实验还要求实现监视点功能,即断点。断点是调试中的一个关键元素,允许在特定代码行暂停程序执行,以便检查程序的状态。 这个实验全面地覆盖了计算机系统的基础知识,从底层的指令集到高级的调试技术,旨在加深学生对计算机系统运行机制的理解,并提供实践经验。通过这样的实验,学生不仅能够学习到理论知识,还能提升实际编程和解决问题的能力。
Nexus是Sonatype公司开发的一款强大的 Maven仓库管理器,它集成了Maven仓库代理、存储库聚合以及组件发布等功能,广泛应用于Java开发者的构建和部署流程中。标题"nexus-3.30.0-01-win64.zip"表示的是Nexus 3的30.0.0.1版本的Windows 64位安装包,这通常用于在Windows操作系统上搭建和管理本地或企业级的Maven仓库。 描述中提到可以从官方网站下载,这确保了软件来源的正规性与安全性。下载地址是https://help.sonatype.com/repomanager3/download/,这是Sonatype官方的帮助页面,用户可以在此获取最新版本的Nexus Repository Manager及其相关的文档和资源。 Nexus的核心功能包括: 1. **代理仓库**:Nexus可以作为Maven中央仓库的代理,减少对互联网的直接访问,提高开发效率。通过配置,它可以缓存远程仓库中的组件,本地团队可以快速获取所需依赖。 2. **存储库聚合**:允许用户将多个存储库(如Maven、npm、NuGet等)组合成一个逻辑组,便于管理和查找组件。 3. **组件发布**:开发者可以使用Nexus发布自己的软件组件,确保版本控制和权限管理。 4. **安全控制**:Nexus提供了精细的访问控制策略,可以限制不同用户或团队对不同存储库的访问权限。 5. **质量检查**:内置的构件验证功能可以检查上传的组件是否符合预设的规则,比如POM格式正确性、签名验证等。 6. **搜索与浏览**:Nexus提供图形界面,方便用户搜索、浏览和管理仓库中的组件。 7. **持续集成**:与CI/CD工具如Jenkins、GitLab CI/CD等集成,自动化构建和部署过程。 8. **版本管理**:支持SNAPSHOT版本的管理,方便进行开发阶段的版本迭代。 压缩包内的两个主要文件“sonatype-work”和“nexus-3.30.0-01”可能是Nexus的安装目录结构。"sonatype-work"通常包含Nexus运行时的数据和配置,如数据库连接信息、日志文件等;而"nexus-3.30.0-01"可能是Nexus的可执行程序和配置文件,用于启动和配置服务。 在安装和配置Nexus时,用户需要注意以下几点: - 安装路径应避免有空格和特殊字符,以防运行时出现问题。 - 配置文件通常位于“nexus-3.30.0-01/conf”目录下的“nexus.properties”,根据实际需求进行修改。 - 启动Nexus通常需要指定JAVA_HOME环境变量,确保使用的是兼容的Java版本。 - 需要创建并配置至少一个仓库,如Maven公共仓库的代理,以便开始使用。 - 对于生产环境,应考虑设置备份策略,防止数据丢失。 Nexus作为一款强大的软件仓库管理工具,对于Java开发者和企业来说,是构建高效、安全的软件供应链的重要组成部分。通过正确配置和使用,能够大大提高软件开发和发布的效率,同时保障组件的质量和安全性。

65,198

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧