C++ 对C++;

C++ 对C++;,c++,visual-c++,C++,Visual C++,“将非常量指针参数传递给期望引用常量指针参数的函数”中的最后一项是一个扩展,因此可以将其视为一个有益的功能。然而,我没有看到它的价值。他们展示的例子表明这是危险的 typedef int T; const T acT = 9; // A constant of type 'T' const T * pcT = & acT; // A pointer to a constant of type 'T' void func2 ( c

“将非常量指针参数传递给期望引用常量指针参数的函数”中的最后一项是一个扩展,因此可以将其视为一个有益的功能。然而,我没有看到它的价值。他们展示的例子表明这是危险的

typedef int T;

const T  acT = 9;                 // A constant of type 'T'
const T * pcT = & acT;            // A pointer to a constant of type 'T'

void func2 ( const T * & rpcT )   // A reference to a pointer to a constant of type 'T'
{
    rpcT = pcT;
}

T * pT;                           // A pointer to a 'T'

void func ()
{
    func2 ( pT );                 // Should be an error, but isn't detected
    * pT   = 7;                   // Invalidly overwrites the constant 'acT'
}
为什么它是一个扩展而不是一个bug?

因为“它不是bug,它是一个特性。”

是的,这显然是件坏事。你必须问微软的负责工程师,但我怀疑这是一个bug,它之所以被维护,只是因为在某个时候有人的软件依赖于它,而微软想保持向后兼容性


但是,此文档似乎已过时:我无法让Visual Studio 2015或2013接受使用此扩展的代码。

因为它是Microsoft,而且他们喜欢添加无法在标准编译器上编译的任意操作,因此您必须仅为其操作系统开发代码。免责声明:这个答案是有偏见的,因为我不喜欢微软。对于一个更严肃的回应,这是非常奇怪的,也不确定他们为什么会特别允许这样做。他们可能在文档的某个地方有这样的原因。大概是因为有足够多的遗留代码依赖于此“bug”(可能是无意中),所以他们不愿意删除扩展。:“拥抱、扩展和熄灭”,也称为“拥抱、扩展和消灭”,这是美国司法部发现的一个短语,微软内部使用该短语来描述其进入涉及广泛使用的标准的产品类别的战略,用专有能力扩展这些标准,然后利用这些差异使其竞争对手处于劣势。”。我高度怀疑产生EEE的文化,以及维基百科MS诉讼页面,是非常相关的。有趣的是,这个例子并没有编译。