Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于decltype的常量限定符_C++_C++11 - Fatal编程技术网

C++ 用于decltype的常量限定符

C++ 用于decltype的常量限定符,c++,c++11,C++,C++11,我第一次尝试使用decltype 不编译,抱怨分配给只读变量ptr。我试图实现的是ptr的类型为const int*。我怎样才能让它工作?谢谢。您的ptr声明基本上是常量int*ptr或int*const ptr。因此指针是常量,而不是它指向的对象。 您可以使vals const,或者至少将其强制转换为decltype中的const,或者使用std::vector的typedefs而不是decltype。您的ptr声明基本上是const int*ptr或int*const ptr。因此指针是常量

我第一次尝试使用decltype

不编译,抱怨分配给只读变量ptr。我试图实现的是ptr的类型为const int*。我怎样才能让它工作?谢谢。

您的ptr声明基本上是常量int*ptr或int*const ptr。因此指针是常量,而不是它指向的对象。 您可以使vals const,或者至少将其强制转换为decltype中的const,或者使用std::vector的typedefs而不是decltype。

您的ptr声明基本上是const int*ptr或int*const ptr。因此指针是常量,而不是它指向的对象。 您可以使VAL为常量,或者至少将其强制转换为decltype中的常量,或者使用std::vector的typedefs而不是decltype。

std::vector具有常量指针typedef。你可以这样用

decltype(vals)::const_pointer ptr;
获取指向向量类型的正确常量指针。

std::vector具有常量指针typedef。你可以这样用

decltype(vals)::const_pointer ptr;

获取指向向量类型的正确常量指针。

只需在需要之前声明指针即可。然后,您可以在本例中推断其类型,即初始化中所需的常量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;
}

只是不要在需要指针之前声明它。然后,您可以在本例中推断其类型,即初始化中所需的常量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;
}
typedef不是文本替换。decltype不是文本替换。修饰符const应用于它应用于的整个对象,它不会到达decltype的结果内部以更改最左边的对象

但这会起作用,因为现在将const应用于元素类型以使类型const int,然后将ptr作为指向该类型的指针:

const std::remove_reference<decltype(vals[0])>::type * ptr;
typedef不是文本替换。decltype不是文本替换。修饰符const应用于它应用于的整个对象,它不会到达decltype的结果内部以更改最左边的对象

但这会起作用,因为现在将const应用于元素类型以使类型const int,然后将ptr作为指向该类型的指针:

const std::remove_reference<decltype(vals[0])>::type * ptr;

请注意,C++17的std::as_const可以帮助轻松地将对象强制转换为const,而不是as_const和add_const也会影响外部类型,而不是指向的类型?std::vector::operator[]如果向量本身是const,则返回const_引用,否则返回简单引用。所以const_引用的地址应该是const int*。啊,现在我明白了,在访问单个元素之前,你在向量上使用as_const。很好的方法。请注意,C++17的std::as_const可以帮助轻松地将对象强制转换为const,而不是as_const和add_const也会影响外部类型,而不是指向的类型?std::vector::operator[]如果向量本身是const,则返回const_引用,否则返回简单引用。所以const_引用的地址应该是const int*。啊,现在我明白了,在访问单个元素之前,你在向量上使用as_const。很好的方法。decltypevals[0]是int&.@T.C.:嗯,当您试图形成指向它的指针时,类型系统没有足够的智能来折叠它?Blah.decltypevals[0]是int&.@T.C.:嗯,当您试图形成一个指向它的指针时,类型系统没有足够的智能来折叠它?正如你可能知道的,Blah.const int*和int*const是不同的东西。这就是为什么我喜欢让int-const*和int*const始终在它所指的右边。我知道这是不寻常的,但对我自己来说,我很好地理解它并不意味着我也无法阅读另一个版本,不过……正如你可能知道的,const int*和int*const是不同的东西。这就是为什么我喜欢让int const*和int*const始终位于它所指的右边。这是不寻常的,我知道,但对我自己来说,我生活得很好并不意味着我也不能阅读另一个版本,虽然…在这个特殊情况下的好解决方案。在这个特殊情况下的好解决方案。