小编Dea*_*ean的帖子

C++奇怪的表达式编译得很好

为什么以下有效的C++表达式?这些不是lambdas

[]{}();
{}[]{};
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下吗?

c++

48
推荐指数
2
解决办法
4275
查看次数

格式和内部格式之间的差异

我搜索并阅读了有关此内容但无法理解的内容.

纹理内部格式和调用格式之间的区别是什么

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
Run Code Online (Sandbox Code Playgroud)

假设这data是一个32 x 32像素值的数组,其中每个像素有4个字节(无符号字符数据0-255),红色,绿色,蓝色和alpha.

第一个GL_RGBA和第二个之间有什么区别?为什么GL_RGBA_INTEGER在这种情况下无效?

opengl

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

单例对象抛出ctor-再次访问?

我可以使用C ++ 11或C ++ 14(甚至C ++ 17)。假设我有一个单例对象


class MyInstance {
public:
    MyInstance() {
        throw std::runtime_exception("something went wrong"); // Ctor might throw
    }
};

MyInstance& getInstance() {
    static MyInstance obj;
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

现在,我确保对的每个调用getInstance都包装在

try {
    auto& inst = getInstance();
} catch(std::runtime_error& e) {
   // do something
}
Run Code Online (Sandbox Code Playgroud)

我现在想知道的是:如果在构造函数中初始化失败并在日志中抛出并捕获并通知用户后,程序try代码路径中传递并再次调用getInstance,会发生什么?

我做了一些猜测,但我不知道它们是否正确:

该对象具有静态存储,因此仅在我认为之后才会尝试构建它?返回对未构造对象的引用会得到悬挂的引用和未定义的行为吗?是否可以使用unique_ptras静态变量来obj解决此问题,以便我可以多次访问指针,还可以检查对象是否已正确构造(if (uptr == TRUE))?

c++ memory-management exception unique-ptr

16
推荐指数
2
解决办法
353
查看次数

在lambda中的分配

我正在查看以下(可能是C++ 14)代码

auto min_on = [](auto&& f) {
  return [f=decltype(f)(f)](auto&& arg0, auto&&...args) {
    // call your function here, using decltype(args)(args) to perfect forward
  };
}
Run Code Online (Sandbox Code Playgroud)

lambda捕获列表中奇怪的赋值是什么?我从未在捕获列表中看到过任务

f=decltype(f)(f)
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

c++ lambda

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

for 循环中的隐式内存别名

我正在使用 golangci-lint,但在以下代码中出现错误:

versions []ObjectDescription
... (populate versions) ...

for i, v := range versions {
    res := createWorkerFor(&v)
    ...

}
Run Code Online (Sandbox Code Playgroud)

错误是:

G601: Implicit memory aliasing in for loop. (gosec)
                     res := createWorkerFor(&v)
                                            ^
Run Code Online (Sandbox Code Playgroud)

“for 循环中的隐式内存别名”究竟是什么意思?我在 golangci-lint 文档中找不到任何错误描述。我不明白这个错误。

static-analysis go

15
推荐指数
2
解决办法
6946
查看次数

这里需要`std :: move`吗?

std::move在以下片段中是否有必要?

std::function<void(int)> my_std_function;

void call(std::function<void(int)>&& other_function)
{
  my_std_function.swap(std::move(other_function));
}
Run Code Online (Sandbox Code Playgroud)

据我所知call()接受一个右值引用..但由于右值引用本身就是一个左值,为了调用swap(std::function<void(int)>&&)我必须将它重新转换为右值引用std::move

我的推理是正确的还是std::move在这种情况下可以省略(如果可以,为什么?)

c++ c++11

13
推荐指数
2
解决办法
1026
查看次数

std :: tie vs std :: make_tuple

这段代码编译但我想知道哪个版本应该是首选的:

#include <iostream>
#include <tuple>
using namespace std;

tuple<int, int, int> return_tuple1() {
    int a = 33;
    int b = 22;
    int c = 31;
    return tie(a, b, c);
}

tuple<int, int, int> return_tuple2() {
    int a = 33;
    int b = 22;
    int c = 31;
    return make_tuple(a, b, c);
}

int main() {
    auto a = return_tuple1();
    auto b = return_tuple2();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于函数按值返回元组,使用std::tie权限应该没有任何问题?(即没有悬空参考)

c++ tuples

13
推荐指数
2
解决办法
4033
查看次数

允许转换为void(不是指针),为什么?

为什么我可以将此向量转换为void(甚至不是指针)?

int main()
{
   std::vector<int> a;
   (void)a;
}
Run Code Online (Sandbox Code Playgroud)

怎么允许这个?

c++ language-lawyer

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

Rvalue转发引用

我正在阅读参考折叠规则,我有一个问题:为什么我将rvalue A传递给

template<typename T>
void foo(T&&);
Run Code Online (Sandbox Code Playgroud)

T推断为A?

例如,如果我传递std::string()给函数T被推断为std::string,为什么不std::string&&呢?这对我来说更有意义,推断出T类型本身背后的理由是什么?

c++ c++11

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

全局变量0初始化惩罚

这是一个非常简单的问题:

0初始化全局变量和静态变量是否在运行时有任何性能损失(尽管非常小)?

c++

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