小编Pio*_*otr的帖子

为什么std :: forward有两个签名?

cplusplus.com所述,std::forward有两个签名:

template <class T> T&& forward (typename remove_reference<T>::type& arg) noexcept;
template <class T> T&& forward (typename remove_reference<T>::type&& arg) noexcept;
Run Code Online (Sandbox Code Playgroud)

典型的用法std::forward是在将参数传递给其他函数时保留rvalueness.让我们用一个例子来说明这一点:

void overloaded(int &)  { std::cout << "lvalue"; }
void overloaded(int &&) { std::cout << "rvalue"; }

template <typename T>
void fwd(T && t)
{
  overloaded(std::forward<T>(t));
}
Run Code Online (Sandbox Code Playgroud)

当我们打电话时fwd(0),T推断为int(t有类型int &&).然后我们打电话std::forward<int>(t).该调用的结果是类型的表达式,int &&因此选择了第二个overloaded函数版本,程序将"rvalue"打印到标准输出.

当我们调用fwd(i)(其中我是一些int变量)时,T推导为int&(t有类型 …

c++ stl rvalue rvalue-reference c++11

5
推荐指数
1
解决办法
324
查看次数

如何引用命令替换以使其行为类似于"$ @"?

$*相当于$1 $2 $3...- 拆分所有空格.

"$*"相当于"$1 $2 $3..."- 这里没有分裂.

"$@"相当于"$1" "$2" "$3"...- 分裂参数(每个参数单独引用).

如何引用$(command) 以便它以相同的方式"$@"处理命令的输出行来处理参数?

我想解决的问题:

我有一个备份函数,通过参数获取文件并备份每个文件(例如:) backup file1 file_2 "file 3".我想快速备份另一个命令返回的文件.

mycmd返回三个文件(每行一个):file1,file_2file 3(包含空格).如果我运行以下命令:

backup $(mycmd)

它将等同于运行,backup file1 file_2 file 3并且由于不存在的文件3而导致错误.但是这样运行:

backup "$(mycmd)"

相当于运行:

backup "file1
file_2
file 3"

它们都不够好.

如何使用命令替换来获得相当于的调用:backup "file1" "file_2" "file 3"

目前我唯一的解决方法是:

while read line; do backup "$line"; done …

bash quoting command-substitution

2
推荐指数
1
解决办法
202
查看次数