我第一次尝试使用decltype
vector<int> vals;
const decltype(&vals[0]) ptr;
for (const auto& val : vals)
ptr = &val;
无法编译,抱怨分配给只读变量ptr
。我想要实现的是ptr
类型const int*
。我怎样才能使它工作?感谢。
答案 0 :(得分:7)
std::vector
有一个const_pointer
typedef。您可以使用
decltype(vals)::const_pointer ptr;
获取向量类型(Live Example)的正确const指针。
答案 1 :(得分:3)
只是在需要之前不要声明指针。然后你可以在初始化中推断出它的类型(在这种情况下,是期望的const int*
)。
这有效:
std::vector<int> val {1,2,3,4};
for (const auto &v : val) {
auto p = &v;
std::cout << *p;
}
这失败了:
std::vector<int> val {1,2,3,4};
for (const auto &v : val) {
auto p = &v;
*p = 7;
}
答案 2 :(得分:1)
您对ptr
的声明基本上是const (int *) ptr
或int * const ptr
。所以指针是常量,而不是它指向的对象。
您可以vals
const
,或者至少将其const
内的decltype
投放到std::vector
,或使用decltype
的typedef代替date_1
}。
答案 3 :(得分:1)
typedef
不是文字替代。 decltype
不是文字替代。修饰符const
适用于它应用的整个事物,它不会到达decltype的结果内部来改变最左边的东西。
这样可行,因为现在const
应用于元素类型以生成类型(const int)
,然后ptr
成为指向该类型的指针:
const std::remove_reference<decltype(vals[0])>::type * ptr;
请注意,这个不起作用,因为它无用地尝试const
- 限定引用类型:
std::add_pointer<const decltype(vals[0])>::type ptr;