小编Sam*_*mik的帖子

无法将左值绑定到右值参考

我有这个C++测试代码片段,

#include <vector>

class A {
        std::vector<int> x;
public:
        A(std::vector<int>&& _x) : x(_x) {}
};

class B {
        A a;
public:
        B(std::vector<int>&& _x) : a(/*move(*/_x/*)*/) {}
};
Run Code Online (Sandbox Code Playgroud)

我将传递_x给B作为右值引用,但是当它传递给A构造函数时它会被转换为左值,我必须使用std::move()它才能使它工作.我的问题是为什么_x是左值而不是左值参考a()

c++ rvalue-reference

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

为什么在GCC终端中无法正确显示Unicode字符?

我写了一个小C程序:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main() {
    wprintf(L"%s\n", setlocale(LC_ALL, "C.UTF-8"));
    wchar_t chr = L'?';
    wprintf(L"%c\n", chr);
}
Run Code Online (Sandbox Code Playgroud)

为什么不打印这个角色?

相反,它打印乱码. unicodetest

我检查过:

  • 尝试编译没有setlocale,相同的结果
  • 终端本身可以打印字符,我可以从文本编辑器复制粘贴到终端,它是Ubuntu上的gnome-terminal
  • GCC版本是4.8.2

c unicode gcc

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

即使在Ubuntu 12.10上libgcc_s.so链接未损坏,ld也找不到lgcc_s

我现在面临一个问题,编译与gcc-static-static-libgcc编译器启用的标志和-Wl,-static用于连接上启用的Ubuntu 12.10标志。但是应用程序通过动态链接(无需使用这些标志)可以很好地构建。

/usr/bin/ld: cannot find -lgcc_s

在查看了互联网上的建议后,我发现大部分时间都是从/usr/lib/gcc/i686-linux-gnu/x.x/libgcc_s.so到的链接断开的问题/lib/libgcc_s.so.1。但就我而言,/usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so它指出了/lib/i386-linux-gnu/libgcc_s.so.1确实存在。

$ ls -l /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so
lrwxrwxrwx 1 root root 33 Sep 21  2012 /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so -> /lib/i386-linux-gnu/libgcc_s.so.1
$ ls -l /lib/i386-linux-gnu/libgcc_s.so.1
-rw-r--r-- 1 root root 116244 Sep 21  2012 /lib/i386-linux-gnu/libgcc_s.so.1
$ file /lib/i386-linux-gnu/libgcc_s.so.1
/lib/i386-linux-gnu/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x61fa08eda0f264222649f9481f9e0340567d0862, stripped
Run Code Online (Sandbox Code Playgroud)

的输出ldconfig显示以下内容:

$ sudo /sbin/ldconfig -v | grep libgcc_s
/sbin/ldconfig.real: …
Run Code Online (Sandbox Code Playgroud)

gcc static-linking ubuntu-12.10

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

将多个缓冲区对象与单个顶点数组对象绑定不起作用

我试图了解 OpenGL 顶点缓冲区绑定点和顶点数组索引之间的映射。我有一个二维矩形和一个二维三角形

const GLfloat rect[] = {
       -0.5f,  0.5f,
        0.5f,  0.5f, 
        0.5f, -0.5f,
       -0.5f, -0.5f};

const GLfloat tri[] = { 
        0.0f,  1.0f,
        0.5f,  0.5f,
       -0.5f,  0.5f};
Run Code Online (Sandbox Code Playgroud)

我将它们放在不同的顶点缓冲区对象中,并尝试将它们映射到顶点数组对象的索引,以便前 3 个属性来自三角形,接下来的 2 个属性来自矩形的最后 2 个点。然后我把它们画成三角形条。

GLuint vbo[2];
glGenBuffers(2, vbo);
GLuint varr;
glGenVertexArrays(1, &varr);
glBindVertexArray(varr);
// draw triangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(tri), tri, 0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
// draw rectangle
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferStorage(GL_ARRAY_BUFFER, sizeof(rect), rect, 0);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(3);

glDrawArrays(GL_TRIANGLE_STRIP, …
Run Code Online (Sandbox Code Playgroud)

opengl vertex-buffer vertex-array-object

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

如何在const成员函数中使用非const成员函数?

以下是一个简单的C++结构和一个3D矢量和3x3矩阵的类.正如您所看到的那样,下标运算符对它们都是重载的.我为了能够分配到像那些成员返回从他们的数据成员参考vec[0] = 5.0;,mat[0] = vec3(2.0);mat[0][0] = 3.0;等.现在,我宣布另一家运营商的mat3,这不应该修改矩阵本身,而是应该回到一个新的加号(+)运算符矩阵作为总和.如何将此非修改+运算符设为const

向量

struct vec3 {
    typedef double value_type;
    vec3::value_type x, y, z;

    vec3(const vec3::value_type x,
         const vec3::value_type y,
         const vec3::value_type z)
    : x{x}, y{y}, z{z} {}

    vec3(const vec3::value_type w)
    : vec3(w, w, w) {}

    vec3()
    : vec3(0.0) {}

    // this works because [] operator is not used
    vec3 operator+(const vec3& v) const {
        return vec3(this->x + v.x, this->y + v.y, this->z + v.z);
    } …
Run Code Online (Sandbox Code Playgroud)

c++ const

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