const限定符为decltype

时间:2016-06-30 15:40:38

标签: c++ c++11

我第一次尝试使用decltype

vector<int> vals;
const decltype(&vals[0]) ptr;

for (const auto& val : vals)
    ptr = &val;    

无法编译,抱怨分配给只读变量ptr。我想要实现的是ptr类型const int*。我怎样才能使它工作?感谢。

4 个答案:

答案 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 *) ptrint * 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;