1

我有一个现有std::ostream的 -like 类型,它对operator<<各种类型有几个重载。由于该类型用作const&其他 API 的参数,因此我在调用站点添加了方便的工厂函数以便于内联使用。

我编写了下面的代码,它工作正常(VS2019 和 GCC9),但我想知道几件事:

  1. 我真的需要 1-arg 重载吗?拥有它有什么好处吗?
  2. 1-arg 重载使用 (Scott Meyers') 魔术引用,但可变参数重载应该使用它们吗?我试过Ts...&&了,但 VS2019 不喜欢这样。
  3. 在 Debug 中,我遵循 return 语句,并看到 osl 被移动构造,当我期待 Copy-Elision 发生时,对于这样的助手,使其零开销。这是一个调试构建工件吗?或者以某种方式复制省略不能在这里发生?如果是这样,为什么?
template <typename T> inline
OStreamLike bind(T&& val) {
    OStreamLike osl(1);
    osl << val;
    return osl;
}

template <typename... Ts> inline
OStreamLike bind(Ts... vals) {
    OStreamLike osl(sizeof...(Ts));
    ((osl << vals), ...);
    return osl;
}
4

1 回答 1

1

我真的需要 1-arg 重载吗?拥有它有什么好处吗?

不需要第一次过载。

唯一的好处是避免复制的引用(这可能是为可变参数过载完成的)。

1-arg 重载使用 (Scott Meyers') 魔术引用,但可变参数重载应该使用它们吗?我试过 Ts...&&

可变参数的转发引用将使用Ts&&... args语法。

但是从上面的代码中,您不需要转发引用,常规的 const 引用将是我的选择const Ts&... args

在 Debug 中,我遵循了 return 语句,并看到了osl移动构造,当我期待 Copy-Elision 发生时,对于这样的助手,使其零开销。这是一个调试构建工件吗?或者以某种方式复制省略不能在这里发生?如果是这样,为什么?

NRVO 不是强制性的,即使在 C++17 中也是如此。

NRVO 在这里适用,我希望它至少在优化构建中。

于 2021-11-10T14:27:38.973 回答