c++ - 错误 : binding ‘const double’ to reference of type ‘double&’ discards qualifiers

标签 c++ c++11 ranged-loops

我收到错误

binding ‘const double’ to reference of type ‘double&’ discards qualifiers

编译时:

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})
                            ^

虽然网上还有其他关于此错误的问题,但我正在寻找针对此特定代码的解决方案。我坚持使用 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;
}

最佳答案

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

如果你想要一个远程for,你可以使用一个古老的 C-era 技巧

for (double *a : { &Q.x, &Q.y, &Q.z })
  *a *= *a;

或者,或者,

for (auto a : { std::ref(Q.x), std::ref(Q.y), std::ref(Q.z) })
  a *= a;

关于c++ - 错误 : binding ‘const double’ to reference of type ‘double&’ discards qualifiers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161048/

相关文章:

c++ - 如何仅使用邻接表在无向图中找到存在的循环(顶点也没有)?

c++ - 可以删除绑定(bind)函数时如何安全地使用回调

c++ - 我们可以删除通过引用传递的对象吗?

c++ - 如何实现我的自定义范围 for 循环?

c++ - 我有几个函数重载,每个函数重载都有一个不同的子类;如何检查给定对象使用哪个函数?

c++ - 澄清列表和删除元素

c++ - initializer_list::size() 上的 static_assert

c++ - 基于 vector 获取范围内的项目索引

c++ - 为什么不能使用带范围的for循环打印对象 vector 的内容?

c++ - 忽略来自 stringstream 的值(比如 sscanf 中的 %*f)