我有一个问题,理解为什么某个隐式转换没有像我期望的那样工作。我有以下课程
ref class ManagedWStringArrayWrapper
{
wchar_t** m_pointer;
public:
operator wchar_t**()
{
return m_pointer;
}
};
我认为这也会隐式转换为const wchar_t ** - 但事实并非如此。有人可以告诉我为什么吗?
答案 0 :(得分:3)
从T**
到T const**
的转换并不像您预期的那样直观 - 事实上,它在标准本身作为示例给出const
- 错误的代码。
给出的例子是:
#include <cassert>
int main() {
char* p = 0;
//char const** a = &p; // not allowed, but let's pretend it is
char const** a = (char const**)&p; // instead force the cast to compile
char const* orig = "original";
*a = orig; // type of *a is char const*, which is the type of orig, this is allowed
assert(p == orig); // oops! char* points to a char const*
}
研究上述情况一段时间后,很明显这 与转化T*
→T const*
相同。完全没有!
我在a blog post中提出了相同的问题,常见问题解答也有an entry on it。
答案 1 :(得分:0)
因为那些是不同的东西。例如,如果你看一下C ++库,你会发现通常有两个函数用于执行相同的操作,一个用于const指针,另一个用于非const。 Example.
但您可以轻松添加显式运算符const wchar_t**
。