小编Ady*_*Ady的帖子

从函数返回的对象是否在未使用时仍然创建?

请考虑以下代码.调用doStuff()但未使用返回值时会发生什么?SomeClass还在创建吗?当然,创建本身可能会产生重要的副作用,但复制构造函数也是如此,它们在RVO/copy-elision中仍然被省略.

SomeClass doStuff(){
    //...do stuff
    return SomeClass( /**/);
}

SomeClass some_object = doStuff();
doStuff(); //What happens here?
Run Code Online (Sandbox Code Playgroud)

(编辑:用GCC -O3对此进行测试.构造对象然后立即销毁)

c++ lifetime

19
推荐指数
2
解决办法
1845
查看次数

当移动和复制构造函数存在时,C++默认构造函数不会使用"using"继承

class A{

public:
    A(){};

};

class B : public A{

public:
    using A::A;

    B(const B&) =   default;
    B(      B&&) =  default;

};

B b;
Run Code Online (Sandbox Code Playgroud)

编译器(g ++(5.4.0-6ubuntu1)/ c ++ 11)说"没有用于调用B :: B()的匹配函数",并将复制和移动构造函数列为候选.如果我评论那些默认的那些,那么它就会编译.是什么导致这个?它们明显违约有什么区别?如果那两条线不在那里,他们无论如何都会被拖欠.

c++ constructor language-lawyer c++11 c++17

9
推荐指数
2
解决办法
1080
查看次数

C ++-使用没有模板参数的模板类中的枚举

template<typename T> class SomeClass{

public:
    enum SomeEnum{ SOME_FLAG};

};

SomeClass::SomeEnum some_enum =      SomeClass::SomeEnum::SOME_FLAG;       //NO
SomeClass<int>::SomeEnum some_enum = SomeClass::SomeEnum::SOME_FLAG;       //NO
SomeClass<int>::SomeEnum some_enum = SomeClass<int>::SomeEnum::SOME_FLAG;  //YES
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为

类SomeClass,不带模板参数

没有模版参数,没有办法/解决方法使用它,有点使该类的枚举成为全局类,因此它不依赖于该参数。

不是我不能输入它们,而是它们可能又长又复杂,代码将更难阅读,在这里我不能使用诸如auto之类的东西。(我是模板的新手,如果这个问题很me脚,抱歉。)

c++ templates

4
推荐指数
1
解决办法
1183
查看次数

C++ - 在打印char*时指定std :: cout的最大字符数

假设我有一个const char*,我想用std :: cout打印,但我只想要打印前X个字符.有没有办法告诉std :: cout?(不在字符串中插入终止空值或制作临时副本.)

c++ std c++17

4
推荐指数
1
解决办法
1267
查看次数

完美预测分支的分支预测开销

我读到一个完美预测的分支的开销为零/几乎为零。(例如:https : //stackoverflow.com/a/289860/8038490)我不太明白人们的意思。至少必须评估分支条件,这可以是一个简单的 bool 或函数调用,这需要时间。

c++ performance x86 branch

3
推荐指数
1
解决办法
957
查看次数

OpenGL - glDrawBuffers 设置的状态存储在哪里?

如果我理解正确,您可以将纹理附加到 FBO,然后用于glDrawBuffers将这些附加点链接到(片段)着色器输出索引。glDrawBuffers调用后后一种状态存储在哪里?当前绑定的着色器,FBO,还是全局OpenGL状态?

opengl shader fbo

3
推荐指数
1
解决办法
79
查看次数

无法使函数接受rvalue和lvalue引用

class Vec3{

private:
    float x, y, z;

public:
    Vec3() = default;
    Vec3(const float c) {x = c; y = c; z = c;}

    static  Vec3& normalize(Vec3& v) {/* normalize */ return v;}

};

Vec3 aaa = Vec3( 1.0f);
Vec3 bbb = Vec3::normalize( Vec3( 1.0f));
Vec3 ccc = Vec3::normalize( aaa);
Run Code Online (Sandbox Code Playgroud)

我想编写将向量作为参数的函数,对它们进行一些处理并将它们作为引用返回.

在上面的代码中bbb不会编译,因为它是对rvalue的非const引用.我不能使它成为const因为normalize需要修改对象.如果我使函数接受rvalue references(Vec3&& v)然后ccc不会编译因为aaa是左值.我可以在不写两个版本的情况下完成这项工作normalize吗?

(我对rvalue vs左值引用感到困惑,我不明白为什么a someFunc(const Vec3& v)会接受rvalues和lvalues,而非const版本不会.)

c++ code-duplication rvalue lvalue

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

从git历史记录中删除文件的某些内容

设置存储库后,在最初的提交中,添加的文件之一包含了不应包含的敏感数据(程序员的个人信息)。是否有可能从git历史中完全删除它?不是整个文件,只有几行包含敏感数据。

该存储库是相当新的,因此没有分支,并且自首次提交以来未修改特定文件。(PS:我是git的新手,我还不了解复杂的命令)

git git-rewrite-history

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

C++ - 使用decltype或auto创建临时对象

我有一个对象"a",我想将它复制到一个对象"b",但修改它有点不修改"a".然后,这将是这样的:

class SomeClass{

public:
    int a;

public:
    SomeClass(int _a)       {a = _a;}
    SomeClass& doStuff()    {++a; return *this;}

};

const SomeClass a( 25);
const auto b = SomeClass( a).doStuff();
Run Code Online (Sandbox Code Playgroud)

这很好用,但是我可以说我现在/不想写"a"的类型,然后我想出了这个解决方案:

const auto b = std::remove_const<decltype( a)>::type( a).doStuff();
Run Code Online (Sandbox Code Playgroud)

我这样做了吗?对此有一个不那么难看的解决方案吗?(我不必两次输入"a".)使用汽车或其他东西.优选不是宏.

c++

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