3

假设我有一个简单的结构......

struct A {
    std::vector<uint32_t> v;
};

我想找到向量元素类型的大小......

sizeof(A::v);                        // legal
sizeof(decltype(A().v)::value_type); // legal
sizeof(A::v::value_type)             // illegal 

错误信息...

example.cpp:18:44:错误:'A' 中没有名为 'v' 的成员

为什么第三版失败了?我不明白添加另一层范围分辨率如何导致更广泛的范围分辨率失败。事实上,第二个例子似乎等同于失败的例子,但显然编译器不同意。

这是一个假设/语言问题。我不是试图解决向量大小的特定问题,而是理解这种语言的奇怪之处。

更新

这是下面答案中的另一个示例,这似乎使我更加困惑...

sizeof(decltype(A::v)::value_type);  // legal  

与在这种情况下有何decltype(A::v)::value_type不同?A::v::value_type

4

2 回答 2

6

我认为您不能使用 :: 令牌从变量中获取类型名。忽略 sizeof 并忽略 A::v。以下不起作用:

A a; // A is some type with a public typedef for value_type in its declaration
A::value_type b; // ok
a::value_type c; // error

GCC 4.7.1 给了我这个错误:

x.cpp:9:1: error: 'a' does not name a type

sizeof 只是因为它是一个接受类型和变量作为其参数的编译时构造,才使这变得混乱。

于 2013-05-08T03:20:49.153 回答
3

如果我错了,请纠正我,但最后一个没有失败,因为您正在访问最后一个中的实例,而在第二个中,您从 decltype() 获取类名。如果您将第三个包装在 decltype 中,则可以使用

sizeof(decltype(A::v)::value_type); 
于 2013-05-08T02:42:46.577 回答