范围访问函数std::begin
声明如下(对于容器):
template< class C >
auto begin( C& c ) -> decltype(c.begin());
我只是想知道为什么它不仅仅是
template< class C >
decltype(C::begin) begin( C& c );
这两者有什么区别吗?
答案 0 :(得分:8)
等效代码为
template< class C >
decltype(::std::declval<C &>().begin()) begin( C& c );
更长,可能更容易出错。
答案 1 :(得分:3)
此版本
template< class C >
decltype(C::begin) begin( C& c )
不会工作,因为
decltype(C::begin)
表示方法的类型,而不是方法调用的结果类型,无论如何begin
方法为标准容器重载,没有函数调用的上下文(即使没有评估),编译器将无法决定应该参与哪个重载 VTT显示的std::declval
版本通过创建未评估的函数调用上下文来修复,可以解决重载问题。使用尾随decltype
代替保存重复参数类型。