这在最近的代码审查讨论中出现过,但是没有得到一个令人满意的结论。所讨论的类型类似于 C + + string _ view TS。它们是围绕一个指针和一个长度的简单的非所有型包装器,用一些自定义函数修饰:
#include <cstddef>
class foo_view {
public:
foo_view(const char* data, std::size_t len)
: _data(data)
, _len(len) {
}
// member functions related to viewing the 'foo' pointed to by '_data'.
private:
const char* _data;
std::size_t _len;
};
出现的问题是,是否有一个参数更愿意通过值或常量引用传递这些视图类型(包括即将到来的 string _ view 和 array _ view 类型)。
支持按值传递的参数相当于“少输入”,“如果视图有有意义的变化,则可以对本地副本进行变异”,以及“可能不会降低效率”。
支持通过 const 引用传递对象的参数相当于“更习惯于通过 const & 传递对象”,而且“效率可能不会降低”。
在通过值或常量引用传递惯用视图类型是否更好的问题上,是否还有其他考虑因素可能使参数产生决定性的变化。
对于这个问题,可以安全地假设 C + + 11或 C + + 14语义,以及足够现代的工具链和目标体系结构等。