代码之家  ›  专栏  ›  技术社区  ›  ar2015

错误:绑定–const double–to-reference of type–double–丢弃限定符

  •  2
  • ar2015  · 技术社区  · 7 年前

    我收到错误

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

    虽然在线上还有其他关于此错误的问题,但我正在寻找解决此特定代码的方法。我坚持使用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;
    }
    
    2 回复  |  直到 7 年前
        1
  •  6
  •   AnT stands with Russia    7 年前

    由创建的初始值设定项列表 {Q.x,Q.y,Q.z} 在您的 for 仍然基于单独的值数组。即使您设法修改了这些值,它仍然不会影响您的 Q ,这显然是你的意图。但无论如何都不能修改它们,因为该数组由 const 元素(这是编译器告诉您的)。

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

    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;
    
        2
  •  0
  •   alfC    7 年前

    当然,正确的答案是:

    for_each(std::tie(x, y, z), [](auto& a){a *= a;});

    定义如下:

    template <typename Tuple, typename F, std::size_t ...Indices>
    void for_each_impl(Tuple&& tuple, F&& f, std::index_sequence<Indices...>) {
        using swallow = int[];
        (void)swallow{1,
            (f(std::get<Indices>(std::forward<Tuple>(tuple))), void(), int{})...
        };
    }
    template <typename Tuple, typename F>
    void for_each(Tuple&& tuple, F&& f) {
        constexpr std::size_t N = std::tuple_size<std::remove_reference_t<Tuple>>::value;
        for_each_impl(std::forward<Tuple>(tuple), std::forward<F>(f),
                      std::make_index_sequence<N>{});
    }
    
    int main(){
        double x, y, z;
        for_each(std::tie(x, y, z), [](auto& a){a *= a;});
    }
    

    参考号: https://codereview.stackexchange.com/a/67394/82510

    推荐文章