我有以下由gcc编译的代码:
#include <iostream>
using namespace std;
class Buffer {
public:
operator char *() { cout << "operator const * called" << endl; return buff; }
private:
char buff[1024];
};
int main(int, char**) {
Buffer b;
(char *)b; // Buffer::operator char * is called here
return 0;
}
我看到的是在线调用Buffer :: operator char *:
(char *)b;
为什么C样式转换调用在这里调用Buffer :: operator char *?
我虽然那个
static_cast<char *>(b);
应该使用来显式调用Buffer :: operator char *。
答案 0 :(得分:4)
如果您已完成(char *)(&b)
,则会进行C样式转换,并且不会调用operator char*
。在这里,您尝试将对象转换为char *。由于没有自动转换编译器查找由您提供的运算符char *。如果您没有提供,则会收到编译错误,指出Buffer
无法转换为char*
答案 1 :(得分:2)
在C ++中,C样式的强制转换决定static_cast
,const_cast
或reinterpret_cast
,具体取决于参数的类型和目标类型。
如果你想要C演员,你需要明确地使用 reinterpret_cast
。
如果您不想要默认行为,请明确指定您想要的演员类型。
答案 2 :(得分:2)
显式类型转换可以使用功能表示法(5.2.3),类型转换运算符(
dynamic_cast
,static_cast
,reinterpret_cast
,const_cast
)来表示,或者 cast 表示法。cast-expression: unary-expression ( type-id ) cast-expression
你在这里有表达式,它调用用户定义的强制转换操作符。
答案 3 :(得分:2)
C风格的强制转换使编译器执行static_cast
,const_cast
,reinterpret_cast
或它们的某些组合。更确切地说:
执行的转化
* a const_cast (expr.const.cast), * a static_cast (expr.static.cast), * a static_cast followed by a const_cast, * a reinterpret_cast (expr.reinterpret.cast), or * a reinterpret_cast followed by a const_cast,
可以使用演员表演 显式类型转换的表示法。 相同的语义限制和 行为适用。如果转换可以 被解释为不止一个 上面列出的方式,解释 列表中首先出现的是 使用,即使是由此产生的演员表 这种解释是不正确的。如果 转换可以解释为 不止一种方式作为static_cast 然后是const_cast, 转换是不正确的
由于规则有点复杂,最好避免C风格的演员表,以确定究竟是做了什么。
答案 4 :(得分:0)
C ++中的C风格转换真的意味着:嘿编译器,你为什么不帮助我在这里找出如何最好地转换为目标类型?并且,编译器有义务。在这里你有一个指定的转换运算符,它被调用,因为这是编译器认为最好的。
注意,除非你完全确定你想要达到的目的,否则不应该使用这个巧妙的小技巧(使用C风格的演员表)。