c++ - 为什么 container.value_type 在 C++ 中是非法的

标签 c++ language-lawyer

以下代码是非法的:

#include <vector>
#include <utility>

int main() {
    std::vector<std::pair<int, char> > v;
    v.push_back(v.value_type(0, 'a')); // *
}

我必须将 * 更改为

v.push_back(decltype(v)::value_type(0, 'a'));

让代码正常工作。

为什么不允许标有*的行?这个理由背后的原因是什么?

最佳答案

总而言之,这是因为 C 对类型和变量有单独的命名空间,这意味着如果 . 可能是,您可以构建由于 C++ 中的歧义而无法访问成员的场景用于以这种方式访问​​成员和类型。更改命名空间规则会破坏与合法 C 代码的兼容性。

struct s1 { typedef int X; };
struct s2 { void X(); };
typedef struct s1 X;
struct s2 X;
int main() {
    X.X();
}

现在呢?您无法从上下文中判断 X.X 应该是什么。

这就是为什么 .:: 在语言中 - X.X() 指的是成员函数调用,而 X::X 指的是一个类型。

关于c++ - 为什么 container.value_type 在 C++ 中是非法的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19908267/

相关文章:

c++ - boost/property_tree/xml_parser.hpp : No such file or directory

c++ - 命名空间范围内的外部 - gcc vs clang vs msvc

c++ - 通常对函数名的非限定查找与对变量名的查找不同吗?

c++ - 如果结构化绑定(bind)不能是 constexpr 为什么它们可以在 constexpr 函数中使用?

c++ - 字符串操作,转换时在字符串开头显示 0

c++ - g++ 包括 boost 库

c++ - 误解重复指令 - 它应该失败,但没有

c++ - 仅限 CLion 调试配置

C:允许将任何数组分配给指向不完整类型数组的指针

c++ - C++ 中 CV 限定的基类