Mic*_*ang 3 c++ language-lawyer
以下代码是非法的:
#include <vector>
#include <utility>
int main() {
std::vector<std::pair<int, char> > v;
v.push_back(v.value_type(0, 'a')); // *
}
Run Code Online (Sandbox Code Playgroud)
我必须改变*
v.push_back(decltype(v)::value_type(0, 'a'));
Run Code Online (Sandbox Code Playgroud)
使代码工作.
为什么标记*的行不允许?这个理由背后的原因是什么?
长和短,是因为C具有单独的类型和变量名称空间,这意味着您可以构建由于C++中的歧义而无法访问成员的场景,如果.可以用于以这种方式访问成员和类型.并且更改命名空间规则会破坏与合法C代码的兼容性.
struct s1 { typedef int X; };
struct s2 { void X(); };
typedef struct s1 X;
struct s2 X;
int main() {
X.X();
}
Run Code Online (Sandbox Code Playgroud)
怎么办?你不能从上下文告诉XX应该是什么.
这就是为什么.并且::在语言中 - X.X()指的是成员函数调用,并且X::X指的是类型.
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |