如何制作const引用的元组?

Vah*_*agn 13 c++ gcc tuples tie c++11

说有两个功能:

void ff( const std::tuple<const int&> ) { }

template < typename TT >
void gg( const std::tuple<const TT&> ) { }
Run Code Online (Sandbox Code Playgroud)

并调用这些函数:

int xx = 0;
ff( std::tie( xx ) ); // passes
gg( std::tie( xx ) ); // FAILS !!
Run Code Online (Sandbox Code Playgroud)

GCC 4.7.2无法编译最后一行并报告错误说明,如:

note:   template argument deduction/substitution failed:
note:   types ‘const TT’ and ‘int’ have incompatible cv-qualifiers
note:   ‘std::tuple<int&>’ is not derived from ‘std::tuple<const TT&>’
Run Code Online (Sandbox Code Playgroud)

第一个问题是,如果这符合C++ 11标准,如果不符合,那么为什么呢?

此外,要克服这个问题,需要传递一个const引用元组,gg而不是传递一个非const引用元组(这std::tie使得).这可以通过以下方式完成:

gg( std::tie( std::cref(x) ) );
Run Code Online (Sandbox Code Playgroud)

然而,额外的调用std::cref是有点乏味的,所以有一些类似的东西ctie会产生const引用的元组会很棒.

第二个问题是,是否需要ctie手动编写,如果是,那么这是最好的方法吗?

template < typename... T >
std::tuple<const T&...> ctie( const T&... args )
{
    return std::tie( args... );
}
Run Code Online (Sandbox Code Playgroud)

sel*_*tze 4

第一个问题是这是否符合 C++11 标准,如果不符合,那么为什么?

这是预期的行为。在第二种情况下,模板实参推导失败,因为没有T这样的tuple<const T&>结果tuple<int&>

在第一种情况下它可以工作,因为tuple<int&>它可以隐式转换为tuple<const int&>. 这是用户定义的转换,因此在模板参数推导过程中不予考虑。

你的问题有点像 X/Y 问题。考虑发布让您寻找涉及此类函数模板/元组组合的解决方案的真正问题。

你的ctie函数模板看起来不错。但请记住,像这样的事情

auto t = ctie(5);
Run Code Online (Sandbox Code Playgroud)

基本上会产生一个悬空引用。因此,您可能只想限制ctie为左值。