错误:将'const double'绑定到类型'double&'丢弃限定符的引用

ar2*_*015 2 c++ c++11 ranged-loops

我收到错误

将'const double'绑定到类型'double&'丢弃限定符的引用

编译时:

g++ -std=c++11 main.cpp
main.cpp: In function ‘Point square(const Point&)’:
main.cpp:14:28: error: binding ‘const double’ to reference of type ‘double&’ discards qualifiers
  for(double &a:{Q.x,Q.y,Q.z})
                            ^
Run Code Online (Sandbox Code Playgroud)

虽然在线有关于此错误的其他问题,但我正在寻找这个特定代码的解决方案.我坚持使用ranged for.

#include <iostream>
#include <vector>

class Point
{
public:
    double x,y,z;
};

Point square(const Point &P)
{
    Point Q=P;
    for(double &a:{Q.x,Q.y,Q.z})
        a*=a;
    return Q;
}

int main()
{
    Point P{0.1,1.0,10.0};
    Point Q=square(P);
    std::cout<<"----------------"<<std::endl;
    std::cout<<"Q.x: "<<Q.x<<std::endl;
    std::cout<<"Q.y: "<<Q.y<<std::endl;
    std::cout<<"Q.z: "<<Q.z<<std::endl;
    std::cout<<"----------------"<<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 6

{Q.x,Q.y,Q.z}在您的上下文中创建的初始化列表for仍然基于单独的值数组.即使你以某种方式设法修改这些值,它仍然不会影响你Q,这显然是你的意图.但是无论如何你都无法修改它们,因为那个数组由const元素组成(这是编译器告诉你的).

如果你想要一个远程,for你可以使用旧的C时代技巧

for (double *a : { &Q.x, &Q.y, &Q.z })
  *a *= *a;
Run Code Online (Sandbox Code Playgroud)

或者,或者

for (auto a : { std::ref(Q.x), std::ref(Q.y), std::ref(Q.z) })
  a *= a;
Run Code Online (Sandbox Code Playgroud)