有没有办法在 Vim 中编辑缓冲区(文本文件,你知道我的意思)的列吗?例如,在隐藏第 2 列和第 3 列之前缓冲区中可见的文本:
abbcccccc
accdddddd
Run Code Online (Sandbox Code Playgroud)
在隐藏它们之后:
acccccc
adddddd
Run Code Online (Sandbox Code Playgroud)
(更不用说我正在处理非常大的文件(有时超过 200 GB)。)
是的,我找到了 foldcol.vim,但它需要一个补丁,而且我没有 gcc 来作为服务器上的用户编译它。
提前致谢。
我花了很长时间来理解右值和临时对象之间的区别.但现在最终的委员会草案在第75页说明:
一个右值 [...] 是一个x值,临时对象或子对象,或它们的不与一个对象相关联的值.
我不敢相信自己的眼睛.这一定是个错误吧?
为了澄清,以下是我理解这些术语的方式:
#include <string>
void foo(std::string&& str)
{
std::cout << str << std::endl;
}
int main()
{
foo(std::string("hello"));
}
Run Code Online (Sandbox Code Playgroud)
在这个程序中,有两个表达式表示同一个临时对象:prvalue std::string("hello")和左值str.表达式不是对象,但它们的评估可能会产生一个.具体来说,prvalue的计算产生一个临时对象,但prvalue不是临时对象.有没有人同意我或让我疯了?:)
例如,这个函数f定义如下:
int f(int x){return x;}
Run Code Online (Sandbox Code Playgroud)
如你所知你不能分配对这个临时int的引用:
int& rf=f(2);// this will give an error
Run Code Online (Sandbox Code Playgroud)
但如果我重新定义我的函数f如下:
int& f(int x){return x;}
f(2);// so now f(2) is a reference of x, which has been destroyed
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:编译器怎么能不让你创建一个临时的引用,这个引用将在statment之后被销毁(在第一种情况下为int).另一方面,它允许你创建一个引用f(2),x而编译器知道这个将被销毁之后return.
当我尝试在ideone上编译以下内容时:
class X
{
public:
friend X& operator+=(X& x, const X& y);
};
X& operator+=(X& x, const X& y) { return x; }
int main()
{
X() += X();
}
Run Code Online (Sandbox Code Playgroud)
正如所料,这会引发编译错误,因为您无法将临时传递给非const引用.
但是,以下内容在ideone上成功编译:
std::string() += std::string();
Run Code Online (Sandbox Code Playgroud)
不应该像我上面的例子那样出错吗?
编辑:
如果std :: string()定义+=为成员操作,为什么在这样的用法允许左侧是临时的时候呢?为什么不像我上面那样定义它并避免引用临时问题?
如果我有一个类A(按值返回一个对象),并且两个函数f()和g()只有它们的返回变量不同:
class A
{
public:
A () { cout<<"constructor, "; }
A (const A& ) { cout<<"copy-constructor, "; }
A& operator = (const A& ) { cout<<"assignment, "; }
~A () { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
Run Code Online (Sandbox Code Playgroud)
现在,当我执行该行时A b = f(a);,它输出:
copy-constructor, constructor, f, destructor假设f()中的对象y直接在目的地创建,即在对象b的内存位置创建,并且没有涉及临时值,这很好. …
请考虑以下代码:
#include <iostream>
struct A {
~A() { std::cout << "~A" << std::endl; }
};
struct B {
~B() { std::cout << "~B" << std::endl; }
};
struct C {
~C() { std::cout << "~C" << std::endl; }
void operator<<(const B &) {}
};
C f(const A &a = A()) {
return C();
}
int main() {
f(A()) << B();
}
Run Code Online (Sandbox Code Playgroud)
使用GCC进行编译并运行会提供以下输出:
~C
~A
~B
Run Code Online (Sandbox Code Playgroud)
是否保证在与其他编译器一起编译时,将按此顺序调用类型A,B和C的临时对象的析构函数?一般来说,如果有的话,析构函数调用的顺序是什么?
为什么在评估完整表达式后调用临时对象的析构函数不是:
#include <iostream>
struct A
{
int a;
A();
~A();
};
A::~A()
{
std::cout << "~A()" << std::endl;
}
A::A()
{
std::cout << "A()" << std::endl;
}
int main()
{
A b = A(); //Constructing of temporary object and applies copy-initalization
std::cout << "side effect" << std::endl;
//Destructor calling.
}
Run Code Online (Sandbox Code Playgroud)
输出:
A()
side effect
~A()
Run Code Online (Sandbox Code Playgroud)
但是12.2/3 [class.temporary]说:
当实现引入具有非平凡构造函数(12.1,12.8)的类的临时对象时,它应确保为临时对象调用构造函数.类似地,应该使用非平凡的析构函数(12.4)调用析构函数.临时对象作为 评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点.
我怎样才能传递临时数组?我想做这样的事情:
#include <iostream>
int sum(int arr[]) {
int answer = 0;
for (const auto& i : arr) {
answer += i;
}
return answer;
}
int main() {
std::cout << sum( {4, 2} ) << std::endl; // error
std::cout << sum( int[]{4, 2} ) << std::endl; // error
}
Run Code Online (Sandbox Code Playgroud)
我在函数参数的括号中是否需要正整数文字[]?如果我包含该文字,它会限制我可以传递给那个大小的数组的数组吗?另外,如何通过rvalue引用或const引用传递数组元素?因为上面的示例没有编译,我认为制作函数的参数类型int&&[]或const int&[]不起作用.
我需要创建一个reduce类似的函数std::reduce,但不是处理容器,这个函数应该适用于可变参数.
这就是我目前拥有的:
template <typename F, typename T>
constexpr decltype(auto) reduce(F&&, T &&t) {
return std::forward<T>(t);
}
template <typename F, typename T1, typename T2, typename... Args>
constexpr decltype(auto) reduce(F&& f, T1&& t1, T2&& t2, Args&&... args) {
return reduce(
std::forward<F>(f),
std::forward<F>(f)(std::forward<T1>(t1), std::forward<T2>(t2)),
std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
以下按预期工作:
std::vector<int> vec;
decltype(auto) u = reduce([](auto &a, auto b) -> auto& {
std::copy(std::begin(b), std::end(b), std::back_inserter(a));
return a;
}, vec, std::set<int>{1, 2}, std::list<int>{3, 4}, std::vector<int>{5, 6});
assert(&vec == &u); // ok
assert(vec == …Run Code Online (Sandbox Code Playgroud) 与此问题略相关,我想在shell脚本中使用一个临时分支。
有点像:
cd $(git rev-parse --show-toplevel) &&
git subtree split --prefix=some_subfolder -b temp &&
git push my_remote temp:publication_branch -f
Run Code Online (Sandbox Code Playgroud)
现在,我不确定如果分支temp已经存在,该怎么办,无论如何,我都不希望结果my_remote/publication_branch依赖于此。而且我也不想修改分支temp(假设我有不相关的东西)。充其量,我也会在最后进行清理
cd $(git rev-parse --show-toplevel) &&
git subtree split --prefix=some_subfolder -b temp &&
git push my_remote temp:publication_branch -f
git branch -D temp
Run Code Online (Sandbox Code Playgroud)
因此,我正在寻找一种创建尚不存在的临时分支名称的方法,类似于mktemp?是否有可以创建临时分支名称的git命令?