推断模板返回类型中 pair 成员的恒定性

Deducing constness of a pair member in a template return type

提问人:sbi 提问时间:12/21/2020 最后编辑:sbi 更新时间:1/25/2021 访问量:93

问:

假设我有一个引用 .它可能指向地图,所以first_type是 .但它也可能是成对的向量,first_type是可变的。如何定义一个函数,该函数返回对该对中第一个的引用?std::pairconst

我尝试过的是:

template<typename TPairIter>
typename std::iterator_traits<TPairIter>::value_type::first_type& first_of_pair_func(TPairIter it) 
{return it->first;}

但是,这会在 is 时为我的代码提供错误。显然,剥离了 .first_typeconststd::iterator_traits<TPairIter>::value_type::first_typeconst

注意:其他代码需要通过执行 .decltype(first_of_pair_func(it))

C++ 返回类型推导

评论

0赞 HTNW 12/21/2020
呃,这似乎按原样工作?godbolt.org/z/bcT74x这个版本肯定更清晰,但如果这个版本失败,我会担心。decltype(auto)
0赞 sbi 12/21/2020
@HTNW:我对此完全不确定。我在这个版本上遇到了错误,当我使用 .然而,从那以后,我继续前进(终于!),并且对此感到厌倦,无法进一步调查。(我知道这以后可能会咬我。BTDT。但是现在是圣诞节前的星期一凌晨 5 点 40 分,我已经休假将近两周了,我只是因为睡不着而追求这个,而且我在这里已经没有动力了。decltype(auto)

答:

0赞 sbi 12/21/2020 #1

当然,自 24 小时前以来,我一直在与这个问题作斗争,我在这里发布问题后 5 分钟内就找到了解决方案。:-/

这就可以解决问题:

template<typename TPairIter>
auto first_of_pair_func(TPairIter it) -> decltype(auto) {return (it->first);}

请注意返回的表达式两边的括号。如果没有它们,则返回类型是 中数据成员的类型,它没有引用限定条件。使用它们时,返回类型具有 since 是左值。firststd::pair&it->first

评论

0赞 sbi 12/21/2020
@HNTW:请不要更改我编写的解决问题的代码。首先,格式完全是主观的,不应该改变。其次,尾随返回类型确实会产生语法差异,这可能很重要:stackoverflow.com/a/24109800/140719。鉴于此代码使用了很多相互调用的模板函数,其中一些是递归调用的,我特意选择了尾随返回类型,即使我们当前拥有的所有代码都可以编译,即使没有。谢谢。
1赞 HTNW 12/21/2020
那篇博文没有提到尾随与前导(这是关于 vs 的,前者需要尾随返回类型,后者只是复制它),并且复制了带有前导的示例,就像原始尾随一样有效。我相当确定,在任何情况下,尾随与领先都没有区别。你甚至会期待什么样的差异?“返回类型延迟”来自自身,而不是它的位置。decltype(auto)decltype(return-expr)decltype(auto)decltype(auto)decltype(auto)decltype(auto)decltype(auto)