我有这个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程序:
#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)
为什么不打印这个角色??
相反,它打印乱码. 
我检查过:
我现在面临一个问题,编译与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) 我试图了解 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) 以下是一个简单的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)