首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:将“const double”绑定到类型“double&”丢弃限定符的引用中

错误:将“const double”绑定到类型“double&”丢弃限定符的引用中
EN

Stack Overflow用户
提问于 2018-01-09 03:30:54
回答 2查看 4.5K关注 0票数 2

我收到错误

绑定“const double”到类型“double&”丢弃限定符的引用

汇编时:

代码语言:javascript
运行
复制
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作为。

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-09 03:40:36

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

如果你想要一个远程for,你可以使用C时代的老把戏。

代码语言:javascript
运行
复制
for (double *a : { &Q.x, &Q.y, &Q.z })
  *a *= *a;

或者,或者,或者

代码语言:javascript
运行
复制
for (auto a : { std::ref(Q.x), std::ref(Q.y), std::ref(Q.z) })
  a *= a;
票数 6
EN

Stack Overflow用户

发布于 2018-01-09 04:07:18

当然,正确的答案是:

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

定义如下:

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48161048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档