相关疑难解决方法(0)

运算符重载的基本规则和习惯用法是什么?

注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案索引,它们是最有意义的顺序:

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading operators c++-faq

2074
推荐指数
8
解决办法
88万
查看次数

运算符重载:成员函数与非成员函数?

我读到一个声明为成员函数的重载运算符是非对称的,因为它只能有一个参数而另一个自动传递的参数是this指针.所以没有比较它们的标准.另一方面,声明为a的重载运算符friend对称的,因为我们传递两个相同类型的参数,因此可以对它们进行比较.

我的问题是,当我仍然可以将指针的左值与参考值进行比较时,为什么会选择朋友?(使用非对称版本提供与对称相同的结果)为什么STL算法仅使用对称版本?

c++ operator-overloading member-functions friend-function non-member-functions

107
推荐指数
2
解决办法
9万
查看次数

了解cout.operator <<()的行为

根据这个问题的最佳答案,cout << expr相当于cout.operator<<(expr).

根据对这个问题的答复,上述说法是不真实的.

根据我自己的测试,cout.operator<<()cout <<给定整数时相同.给定一个浮点数时,将其cout.operator<<()强制转换为整数.当给出一个字符串文字时cout.operator<<("hello world"),它会输出看起来像是内存地址的内容.当给定一个包含std :: string的变量时,它会产生编译错误.

任何人都可以对正在发生的事情进行初级到中级的解释吗?

c++ iostream cout operator-overloading

5
推荐指数
1
解决办法
123
查看次数

Linux中没有符号插入的共享对象,-fno-semantic-interposition error

类Unix系统中的共享对象(*.so)由于符号插入而效率低下:.so内部对全局变量的每次访问都需要GOT查找,而.so内部从一个函数到另一个函数的每次调用都需要一个PLT抬头.因此,我很高兴看到gcc版本5.1添加了选项-fno-semantic-interposition.但是,当我尝试在没有使用PLT的情况下创建一个函数调用另一个函数的.so时,我收到错误消息:

在创建共享对象时,不能使用符号`functionname'重定位R_X86_64_PC32; 用-fPIC重新编译

我期望选项-fno-semantic-interposition可以消除此错误消息,但事实并非如此.-mcmodel = large也无济于事.对函数的引用确实与位置无关,错误消息实际确认了这一点(R_X86_64_PC32表示在64位模式下与PC相关的32位重定位).-fPIC实际上并不意味着与位置无关,正如名称所暗示的那样,它实际上意味着使用GOT和PLT.

我无法使用,__attribute__((visibility ("hidden")))因为被调用的函数和调用者是在单独的文件中编译的(调用者在C++中,称为函数在汇编中).

我试图制作一个汇编列表来查看-fno-semantic-interposition选项的作用.我发现当一个函数在同一个文件中调用另一个函数时,它会引用一个本地别名,但在另一个文件中调用一个函数时它仍然使用PLT.

(g ++版本是5.2.1 Ubuntu,64位模式).

有没有办法让链接器在没有GOT/PLT查找的情况下接受.so内的交叉引用?

shared-libraries

4
推荐指数
1
解决办法
411
查看次数