C++ 结构引用(.)运算符处理vc9中的类名

C++ 结构引用(.)运算符处理vc9中的类名,c++,visual-c++,C++,Visual C++,以下代码在我的vc9版本上编译: wstring test2; if (test2.find(L'c') == wstring.npos) { } 但它本身 wstring.npos; 没有。在我看来,这是100%错误的。起初,我认为可能正在构造一个wstring,并且正在访问npos成员alawstring().npos,但快速尝试进入这一行表明情况并非如此。用我自己的一个类模拟同样的情况,结果是 警告C4832:标记“.”在UDT“Foo”之后是非法的 但仍在编译 只是为了我的理智-这种

以下代码在我的vc9版本上编译:

wstring test2;
if (test2.find(L'c') == wstring.npos)
{
}
但它本身

wstring.npos;
没有。在我看来,这是100%错误的。起初,我认为可能正在构造一个wstring,并且正在访问npos成员ala
wstring().npos
,但快速尝试进入这一行表明情况并非如此。用我自己的一个类模拟同样的情况,结果是

警告C4832:标记“.”在UDT“Foo”之后是非法的

但仍在编译


只是为了我的理智-这种语法不应该工作,对吗?既然它确实有效,为什么表达式
wstring.npos
fail?

wstring.npos
不应该工作,因为
npos
是一个
静态
成员,可以使用作用域解析操作符(
wstring::npos
)的类名访问它,也可以使用点操作符(
wstring str;str.npos;
)的类实例访问它.

因为NPO是类的静态成员


然后是非标准行为,老实说,这是MSVC的期望

我有时感到困惑,为什么在没有检查索赔的有效性的情况下就假定MS有罪

wstring.npos不编译,VS 2008和2010会标记错误


在以前的文章中正确解释了它为什么不编译。

您确定编译的是
wstring.npos
,而不是
test2.npos
?我肯定,只是非常惊讶!然后是非标准行为,老实说,这是MSVC所期望的。我想知道这是否可以用模板和typedef复制。(请记住,
std::wstring
实际上是
std::basic_string
)@aschepper,如果它能让你平静下来,就把它放在GCC上。你有什么想法吗在上下文中不编译?我的猜测是,当VC9知道一个特定的令牌将是一个右值时,它的解析规则有点过于宽松,而
wstring.npos正在作为wstring类型的变量声明处理,语法不正确。我在帖子中的目标更多的是理解“技术上,为什么会发生这种情况”,而不是简单的“这符合标准吗”,尽管我不知道我可能会得到比已经提供的更多的答案。@Rollie“关于表达式wstring.npos;在上下文中不编译的原因有什么想法吗?”。。。它无法编译,因为它无效。我只是这么说。“在上下文中”的意思是:如果(find(…)==wstring.npos)
@Rollie我不知道,你可能会很幸运,让微软的人回答这个问题,或者把它带到微软论坛(可能会提交一个bug报告,因为它绝对不合法)没有跳上反微软的潮流,并真正花时间核实问题,这是一种荣誉。但它确实可以在我的VC9版本上编译:如果不是在你的版本上编译,我很想知道我们的版本之间可能有什么不同!