c++ - 条件运算符的局限性? :

标签 c++ conditional destructor operator-keyword conditional-operator

我正在使用 GCC 4.5 并观察到非常奇怪的行为。我想知道这个运算符是否有我不完全理解的东西。我以为我精通C++。 我有一个用于 Windows HWND 对象的瘦 C++ 包装器类 Wnd,它带有一个已实现的强制转换运算符 operator HWND ...

如果我像这样使用条件运算符(给定输入 Wnd *p 和示例函数 SetParent(HWND)):

SetParent((p!=NULL) ? (HWND)(*p) : NULL)

父级正确设置为 NULLp,具体取决于。这是我所期望的。 但是,如果敢于偷懒并写下:

SetParent(p ? *p : NULL)

事情变得一团糟。 运行 GDB 后,我发现在调用 SetParent 之后,在变量 p 上调用了析构函数。 知道这里发生了什么吗?

编辑 这是我的 Wnd 类:

class Wnd{
        HWND m_hwnd;        ///< the actual handle
        WndFake *fake;      ///< store state here if we do not have a handle
    public:
        virtual ~Wnd();
        //contructor s
        Wnd(HWND wnd=NULL):m_hwnd(wnd),fake(NULL){}
        Wnd(DWORD sty,const jchar *title,const RECT &sz);
        operator HWND(){return m_hwnd;}
        operator HWND() const {return m_hwnd;}
    }

最佳答案

我怀疑您的 Wnd 也有采用 HWND 甚至 int 的非显式转换构造函数? 如果是这样,请明确说明。

您的 Wnd 可能没有声明复制构造函数和 operator=?将这些声明为私有(private)的并且不定义它们。

同时删除 operator HWND 并添加成员函数 HWND hwnd() const; 到您的 Wnd。然后代码看起来可读性如下:

Setparent( p ? p->hwnd() : NULL );

我相信当这些 mod 完成后,您会发现您的 Wnd 出了什么问题。

问题本身就很明显,因为在 ?: 中 : 两边的操作数必须是同一类型,所以 NULL (0) 可以以某种方式转换为 Wnd。所以 *p 的临时拷贝作为 ?: 的返回值,然后调用运算符 HWND。

关于c++ - 条件运算符的局限性? :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6181744/

相关文章:

C++ 析构函数 - 继承上下文中的显式调用

C++ 相当于 java.nio.channels.Selector

c++ - CLion STL 容器无法在 Fedora 23 上的调试器中正确显示

c++ - 在系统上下文中运行进程

c++ - 为这个二进制节点类创建析构函数的正确方法是什么?

c++ - 限制对 C++ 构造函数和析构函数的访问

c++ - Xerces线程安全?

assembly - 用8086汇编语言编程比较两个数

c++ - enable_if 中的短路运算符

tensorflow - 如何使用 tf.cond 进行批处理