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)
第一个问题是这是否符合 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为左值。
| 归档时间: |
|
| 查看次数: |
5024 次 |
| 最近记录: |