我试图了解过载选择规则如何导致以下(非直观)行为.当我有以下功能时:
#include <iostream>
// Overload 1
template<class T>
void write(T data)
{
std::cout << "Called write(T data)" << std::endl;
}
// Overload 2
template<class T, class ...U>
void write(T&& obj, U&&... objs)
{
std::cout << "Called write(T&& obj, U&&... objs)" << std::endl;
}
int main(int, char**)
{
int j = 0;
write(j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
选择void write(T data)过载(过载1).我认为这对我有意义:过载选择的候选者是void write<T>(T) T = int和void write<T,U>(T&) T = int, U = <>.都write(T)和write(T&)将同样的专门的,但这样过载1被选择过载2有一个空的参数包.但是,如果我添加第三个重载:
#include …Run Code Online (Sandbox Code Playgroud) 我有一个使用CMake构建的相当复杂的项目.该项目使用CPack生成.deb包.当我用make(即不构建.deb)构建项目时,干净的构建大约需要2分钟.然而,当我使用make package构建构建一个包需要大约12分钟时,大部分时间花费了额外的10分钟CPack: - Run preinstall target for....
使用"手动"构建.deb dpkg-deb最多只需要几秒钟,所以我想知道CPack在运行预安装目标时正在做什么.
我不一定对为什么我的项目需要很长时间才感兴趣.我更好奇的是预安装目标如何适应CPack构建Debian软件包的过程以及CPack如何选择在运行预安装目标时将采取的操作.
我有两个文本文件,我试图逐行逐行阅读.这些文件不一定具有相同的行数,并且当脚本到达任一文件的末尾时,脚本应该停止读取.我想尽可能保持这种"纯粹"的打击.我发现这样做的大部分解决方案都表明了以下形式:
while read -r f1 && read -r f2 <&3; do
echo "$f1"
echo "$f2"
done < file1 3<file2
Run Code Online (Sandbox Code Playgroud)
但是,如果文件的最后一行没有换行符,则会失败.
如果我只读一个文件,我会做类似的事情:
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line"
done < file1
Run Code Online (Sandbox Code Playgroud)
但是当我尝试通过以下方式扩展它来读取多个文件时:
while IFS='' read -r f1 || [[ -n "$f1" ]] && read -r f2 <&3 || [[ -n "$f2" ]]; do
echo "$f1"
echo "$f2"
done < file1 3<file2
Run Code Online (Sandbox Code Playgroud)
要么
while IFS='' read -r f1 && read -r f2 <&3 || [[ …Run Code Online (Sandbox Code Playgroud)