小编Irf*_*rfy的帖子

重命名/更改cygwin用户名

首次启动Cygwin shell时,您将以Windows上的用户身份登录.如何更改该用户的用户名,将Cygwin用户的现有cygwin关联与Windows用户保持一致?(即没有创建一个全新的Windows帐户)

为什么?我刚从虚拟机转移到Cygwin,并希望重用我的所有脚本和shell自定义,这些脚本和shell自定义假设一个特定的用户名(想想.ssh/config,.subversion等)而不做任何更改.

cygwin username

18
推荐指数
3
解决办法
2万
查看次数

如何检查是否隐式生成移动构造函数?

我有几个类,我想检查是否正在生成默认的移动构造函数.有没有办法检查这个(无论是编译时断言,还是解析生成的目标文件,还是别的东西)?


励志示例:

class MyStruct : public ComplicatedBaseClass {
    std::vector<std::string> foo; // possibly huge
    ComplicatedSubObject bar;
};
Run Code Online (Sandbox Code Playgroud)

如果任何类的任何基Complicated...Object类或成员的任何成员都不能被移动,MyStruct则不会生成其隐式移动构造函数,并且因此可能无法优化复制foo工作,即使foo可移动也可以进行移动.


我希望避免:

  1. 繁琐地检查隐式移动ctor生成的条件,
  2. 显式地和递归地默认所有受影响的类,它们的基础和它们的成员的特殊成员函数 - 只是为了确保移动构造函数可用.

我已经尝试过以下内容但它们不起作用:

  1. std::move明确使用- 如果没有可用的移动ctor,这将调用复制ctor.
  2. 使用std::is_move_constructible-this将在复制构造函数接受时成功const Type&,默认情况下生成(只要移动构造函数未被显式删除,至少).
  3. 使用nm -C以检查移动构造函数的存在[见下文].但是,另一种方法是可行的[见答案].

我试着看一下像这样的普通类的生成符号:

#include <utility>

struct MyStruct {
    MyStruct(int x) : x(x) {}
    //MyStruct(const MyStruct& rhs) : x(rhs.x) {}
    //MyStruct(MyStruct&& rhs) : x(rhs.x) {}
    int x;
};

int main() {
    MyStruct s1(4); …
Run Code Online (Sandbox Code Playgroud)

c++ move-constructor c++11

17
推荐指数
2
解决办法
3783
查看次数

理解`std :: is_move_constructible`

没有移动构造函数但带有接受const T&参数的复制构造函数的类型满足std::is_move_constructible.例如,在以下代码中:

#include <type_traits>

struct T {
    T(const T&) {}
    //T(T&&) = delete;
};

int main() {
    static_assert(std::is_move_constructible<T>::value, "not move constructible");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

T 将没有隐式移动构造函数,因为它具有用户定义的复制构造函数.

但是,如果我们取消注释移动构造函数的显式删除,则代码不再编译.为什么是这样?我原以为显式复制构造函数仍然会满足std::is_move_constructible.

重载是否起作用,选择声明的移动构造函数然后失败,因为它被删除了?


如果a no implicit move ctordeleted move ctorclass 之间的移动构造性之间的差异是由标准规定的,请引用,并且如果可能的话,给出一个基本原理(例如"提供禁止移动构造的设施" - 首先想到的事情).

c++ move-constructor c++11

14
推荐指数
2
解决办法
1794
查看次数

为什么隐式和显式删除移动构造函数的处理方式不同?

关于隐式生成包含/继承类的移动构造函数,C++ 11标准中隐式和显式删除的移动构造函数的不同处理背后的基本原理是什么?

C++ 14/C++ 17有什么改变吗?(C++ 14中的DR1402除外)

注意:我理解发生了什么,我理解它是根据C++ 11标准的规则,我对这些规则的理由感兴趣,这意味着这种行为(请确保不要简单地重申它是这样的方式这是因为标准说的是这样).


假设一个类ExplicitDelete具有明确删除的移动ctor和明确默认的复制ctor.move constructible即使兼容的拷贝ctor可用,这个类也是不可用的,因为重载决策选择了移动构造函数,并且由于删除而在编译时失败.

假设一个ImplicitDelete包含或继承的类,ExplicitDelete不执行任何其他操作.由于C++ 11移动ctor规则,此类将其ctor隐式声明为已删除.但是,这个课程仍将move constructible通过其复制ctor.(这最后的陈述是否与DR1402的解决方案有关?)

然后,Implicit包含/继承的类ImplicitDelete将生成一个完全精细的隐式移动构造函数,该构造函数调用ImplicitDelete复制ctor.

那么允许Implicit能够隐式移动而ImplicitDelete不能隐式移动的理由是什么呢?

在实践中,如果Implicit并且ImplicitDelete有一些重型的可移动成员(想想vector<string>),我认为没有理由ImplicitImplicitDelete移动性能更优越.ImplicitDelete仍然可以复制ExplicitDelete其隐含的动作ctor-就像Implicit它一样ImplicitDelete.


对我来说,这种行为似乎不一致.如果发生以下两种情况之一,我会发现它更加一致:

  1. 编译器同时处理隐式和显式删除的移动ctors:

    • ImplicitDelete变得不move-constructible,就像ExplicitDelete
    • ImplicitDelete的删除的举动男星导致删除的隐含移动构造函数Implicit(在以同样的方式ExplicitDelete做,为ImplicitDelete …

c++ move-semantics c++11

11
推荐指数
1
解决办法
673
查看次数

非布尔的短路

缩短三元运算符的使用是否安全:

process_ptr(ptr ? ptr : default_ptr);
Run Code Online (Sandbox Code Playgroud)

与短路:

process_ptr(ptr || default_ptr);
Run Code Online (Sandbox Code Playgroud)

在C和C++?换句话说,是我们保证让无论是 ptr default_ptr从表达研究背部,或者是它可能允许表达导致任意"逻辑真"值,如果表达式是逻辑真?

这是你在Perl代码中看到的那种代码,但我很少在C/C++中看到它,这是我问题的原始基础.

c c++

10
推荐指数
2
解决办法
781
查看次数

用于异常处理的基类技术

GotW#8的任务是在C++中实现异常中立的通用堆栈数据结构,假设只有模板参数的析构函数不抛出.诀窍是处理潜在的抛出模板参数操作(构造函数,复制构造函数,赋值),以便在它们抛出时使堆栈保持一致状态.

在解决方案中,Herb Sutter说

为了使这个解决方案更简单,我决定不为异常安全的资源所有权演示基类技术.

经过一些谷歌搜索后,我发现Dave Abrahams的答案可追溯到1997年.在他的解决方案中,他处理基类中内存的分配和删除,并在子类中实现堆栈操作.这样,他确保复制构造函数中的元素复制与内存分配分离,这样如果复制失败,无论如何都会调用基类析构函数.

作为参考,这里是Dave的复制构造函数,我的评论添加了:

// v_ refers to the internal array storing the stack elements
Stack(const Stack& rhs)
        : StackBase<T>( rhs.Count() ) // constructor allocates enough space
                                      // destructor calls delete[] appropriately
{
        while ( Count() < rhs.Count() )
           Push( rhs.v_[ Count() ] ); // may throw
}
Run Code Online (Sandbox Code Playgroud)

如果基本构造函数成功,即使子类的复制构造函数抛出,也会保证基本析构函数中的内存清理.

我的问题是:

  1. 除上述内容外,该方法还有其他任何好处吗?
  2. 当我自己解决问题时,我想出了这个拷贝构造函数:

    // v_ refers to the internal array storing the stack elements
    // vsize_ is the amount of space allocated in v_
    // …
    Run Code Online (Sandbox Code Playgroud)

c++

8
推荐指数
1
解决办法
229
查看次数

git:在一个子模块中管理多个遥控器

我的团队使用公开可用的 github 托管项目作为我们主项目中的子模块。我们希望针对该项目管理我们自己的补丁,而不向上游推送,但是除非我们有一个镜像来推送我们的私有分支,否则我们无法共享这些补丁。

假设我们有镜像,我们的子模块需要两个遥控器:一个是我们从中获取上游更改的地方,另一个是我们推送与补丁分支合并的地方。我们如何使用子模块(或超级项目)存储有关遥控器的信息,以便团队的每个成员都可以轻松地执行上游更新,而无需git add remote upstream ...github...project.git.

我们打算通过编写一个 shell 脚本来自动化这个过程和一个用于存储上游遥控器的文件来解决这个问题,但是有没有一种git 方法来做到这一点?

可能相关,但我没有看到合适的解决方案:git add remote in submodule

git git-remote git-submodules

8
推荐指数
1
解决办法
1942
查看次数

是否应该在传递函数指针时转发关于noexcept-ness的知识?

我编写了以下代码来测试noexcept函数调用之间的传播,它似乎不像我想象的那样工作.在GCC 4.7.2中,可以有效地测试一个函数,noexcept不仅仅是直接或作为模板特化参数传递; 但不是作为参数传递给模板化函数,或作为函数指针传递给普通函数 - 即使该函数声明其形式参数为noexcept.这是代码:

#include <iostream>

#define test(f) \
    std::cout << __func__ << ": " #f " is " \
              << (noexcept(f()) ? "" : "not ") \
              << "noexcept\n";

template <void(*f)()>
static inline void test0() {
    test(f);
}

template <typename F>
static inline void test1(F f) {
    test(f);
}

static inline void test2(void(*f)()) {
    test(f);
}

static inline void test3(void(*f)()noexcept) {
    test(f);
}

void f1() {}
void f2() noexcept {} …
Run Code Online (Sandbox Code Playgroud)

c++ noexcept c++11

7
推荐指数
2
解决办法
331
查看次数

在临时字符串上使用string :: c_str

关于临时对象何时被销毁,这是否有效:

FILE *f = fopen (std::string ("my_path").c_str (), "r");
Run Code Online (Sandbox Code Playgroud)

在评估调用fopen之后或之后的第一个参数后,是否会立即销毁临时值fopen.

使用以下代码进行测试:

#include <cstdio>
using namespace std;
struct A {
        ~A() { printf ("~A\n"); }
        const char *c_str () { return "c_str"; }
};
void foo (const char *s) { printf ("%s\n", s); }
int main () {
        foo (A().c_str());
        printf ("after\n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

得到:

c_str
~A
after
Run Code Online (Sandbox Code Playgroud)

这表示首先评估整个语句,然后销毁任何临时语句.这种排序是由标准还是特定于实现的强制要求?

c++ destructor temporary-objects

7
推荐指数
1
解决办法
1056
查看次数

Bash:在长时间自动完成期间显示进度指示器

我有一个bash自动完成功能,它可以查询数据库,为bash中的当前命令行提供可能的完成.完成大约需要3秒钟,在此期间用户没有任何迹象表明他已触发自动完成 - 提示他按下TAB几次,导致自动完成功能可能会再运行几次.

一旦启动自动完成,是否可以以某种方式操作命令行以显示正在执行的操作?例如,当我TAB在命令后按两次foo,我希望立即发生以下情况:

$ foo
autocompleting...
Run Code Online (Sandbox Code Playgroud)

然后在确定可能的完成后,改为:

$ foo
bar        baz        jazz
Run Code Online (Sandbox Code Playgroud)

或者,如果我输入foo j并按TAB一次,则以下内容:

$ foo j
autocompleting...
Run Code Online (Sandbox Code Playgroud)

应该改为

$ foo jazz
Run Code Online (Sandbox Code Playgroud)

没有任何额外的文字,正如预期的那样.

下一步是考虑在自动完成运行时是否可以有动态输出,例如,\ | / -在一个地方打印字符,就好像一条线在适当的位置旋转 - 以直观地指示正在发生的事情.这可能吗?

bash autocomplete

7
推荐指数
1
解决办法
157
查看次数