gpt4 book ai didi

c++ - decltype 不推导 const 对象的 const 成员

转载 作者:太空狗 更新时间:2023-10-29 23:49:16 28 4
gpt4 key购买 nike

#include <type_traits>
#include <functional>

struct Chains
{};

struct Stages
{

Chains mutating_chains;

Chains sideffect_chains;

Chains write_chains;

void forall_chains(const std::function<void(Chains & chain)> & fun)
{
forall_chains(*this, fun);
}

void forall_chains(
const std::function<void(const Chains & chain)> & fun) const
{
forall_chains(*this, fun);
}

template <typename Self>
static void forall_chains(
Self & self,
const std::function<void(decltype(self.mutating_chains) & chain)> & fun)
{
fun(self.mutating_chains);
fun(self.sideffect_chains);
fun(self.write_chains);
}
};

decltype显然有一些我无法理解的东西。因为根据编译器抛出的错误信息, Self 被推导为 const 阶段,那么为什么 self.member 没有被推导为 const member 呢?还有如何让它正常工作,为 const 对象推导出 const 成员?我在表达式 decltype((self.mutating_chains)) 中添加了括号并通过了编译,但我不确定这样做是否正确。

f.cpp: In instantiation of ‘static void Stages::forall_chains(Self&, const std::function<void(decltype (self.mutating_chains)&)>&) [with Self = const Stages; decltype (self.mutating_chains) = Chains]’:
f.cpp:150:33: required from here
f.cpp:158:33: error: no match for call to ‘(const std::function<void(Chains&)>) (const Chains&)’
fun(self.mutating_chains);

最佳答案

I added parenthesis to the expression decltype((self.mutating_chains)) and that passed compilation but I'm not sure if that is the correct thing to do.

是的,在这种情况下这是正确的做法。简而言之,decltype(x) 为您提供 x声明类型,它不依赖于表达式的值类别。

对于类型为 T左值表达式 xdecltype((x)) 会生成 T&,在您的情况下,它正确应用了 const 限定词。

您可以在 cppreference page for decltype(...) 上找到更正式(和准确)的解释.


顺便说一句,请考虑通过模板参数而不是std::function 来传递回调。后者不是零成本抽象 - 它是使用类型删除的重量级包装器,应尽量减少其使用。

template <typename Self, typename F>
static void forall_chains(Self& self, F&& fun){ /* ... */ }

我写了一篇关于这个主题的文章:passing functions to functions .

关于c++ - decltype 不推导 const 对象的 const 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805011/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com