Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是;“操作员无效”;不使用强制转换语法调用? 我玩了下面的代码片段(用Visual C++ 9编译): 类{ 公众: 运算符void(){} }; 类对象; 静态投影(对象); (无效)反对; object.operator void();_C++_Casting_Operators_Operator Overloading - Fatal编程技术网

为什么是;“操作员无效”;不使用强制转换语法调用? 我玩了下面的代码片段(用Visual C++ 9编译): 类{ 公众: 运算符void(){} }; 类对象; 静态投影(对象); (无效)反对; object.operator void();

为什么是;“操作员无效”;不使用强制转换语法调用? 我玩了下面的代码片段(用Visual C++ 9编译): 类{ 公众: 运算符void(){} }; 类对象; 静态投影(对象); (无效)反对; object.operator void();,c++,casting,operators,operator-overloading,C++,Casting,Operators,Operator Overloading,在使用调试器之后,我发现对void进行强制转换不会调用Class::operator void(),只有第三次调用(显式调用操作符)实际调用了操作符,两次强制转换什么都不做 为什么未使用强制转换语法调用运算符void?技术原因见§12.3.2: 转换函数从不用于将(可能符合cv条件的)对象转换为(可能符合cv条件的)同一对象类型(或对它的引用)、该类型的(可能符合cv条件的)基类(或对它的引用)、或(可能符合cv条件的)void 理由是(可能)允许§5.2.9/4起作用: 任何表达式都可以显式转

在使用调试器之后,我发现对
void
进行强制转换不会调用
Class::operator void()
,只有第三次调用(显式调用操作符)实际调用了操作符,两次强制转换什么都不做


为什么未使用强制转换语法调用
运算符void

技术原因见§12.3.2:

转换函数从不用于将(可能符合cv条件的)对象转换为(可能符合cv条件的)同一对象类型(或对它的引用)、该类型的(可能符合cv条件的)基类(或对它的引用)、或(可能符合cv条件的)void

理由是(可能)允许§5.2.9/4起作用:

任何表达式都可以显式转换为“cv void”类型。表达式值将被丢弃

(void)expr
假设对任何表达式的结果值不做任何操作,但如果它调用了转换运算符,则不会丢弃任何内容。因此,他们禁止在转换中使用
操作符void


为什么不将转换类型id设置为
void
?谁知道呢,但请记住这并不是毫无用处的:

structfoo
{
运算符void()
{

std::难道我喜欢你总是问一些奇怪但有趣的问题吗;)这是我的+1。你希望在没有强制转换的情况下执行什么代码?实际上没有……为什么强制转换要改变这个问题?@Eiko:如果那是
操作符int()
,我写了
(int)object;
,那么
操作符int()
将被调用。事实证明,
运算符void()
并非如此,所以我问了这个问题。为了说明这一点,Comeau给出了以下警告:“Class::operator void()”不会被隐式或显式转换调用。gcc警告:
到void的转换将永远不会使用类型转换运算符为什么不将转换类型id设置为
void
?"可能是因为
void
可能隐藏在typedef或template参数后面?@dyp,这就是格式不错误的问题:意外行为:您希望转换运算符转换,但此运算符永远不会转换。使其格式不正确将有助于假定模板库的开发人员尽早捕获错误。B但是,至少现在编译器会对这种情况发出警告。@GreenScape有些用例你不在乎它是否会被调用,而当
格式错误时,你必须生成特殊的情况。就像
f(future.get())
用于
未来
。此外,到
void
的标准转换应该比任何用户定义的转换更具竞争力。
 class Class {
 public:
     operator void() {}
 };

 Class object;
 static_cast<void>( object );
 (void)object;
 object.operator void();
struct foo
{
    operator void()
    {
        std::cout << "huh?" << std::endl;
    }

};

typedef void (foo::*void_function)();

foo f;
void_function func = &foo::operator void;

(f.*func)(); // prints "huh"
f.operator void(); // also does (which you knew)