我已经调试了一段时间的程序,最终发现错误是由于引用没有像我想象的那样更新.
这是一个显示我遇到的问题的示例:
#include <iostream>
using namespace std;
struct Test {
Test& set(int& i){ i = 10; return *this; }
Test& print(const int& i){ cout << i << endl; return *this; }
};
int main(void){
int i = 0;
Test t;
t.set(i).print(i + 5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我曾预料到这里的print()方法会输出15,但输出5.
编辑:10天后我才意识到,用clang输出15!这是GCC中的错误吗?
我注意到如果我运行strings我的程序,由g++输出编译包含它使用的各种类的名称.
该程序是使用-O3和不使用-g或编译的,-p当我删除二进制文件时,类名仍然存在.
我想知道为什么有必要g++将这些信息存储在二进制文件中?存在的类名似乎都是使用虚函数的类,所以我怀疑这与它有关.
我写了一个返回数组的constexpr函数.
#include <iostream>
constexpr auto get_str(void)
-> const char(&)[4] {
return { 'T', 'E', 'S', 'T' };
}
constexpr int sum(const char(&str)[4]){
return str[0] + str[1] + str[2] + str[3];
}
int main(void){
constexpr int s = sum(get_str());
std::cout << s << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.8正确编译代码,但发出以下警告:
test.cpp: In function ‘constexpr const char (& get_str())[4]’:
test.cpp:5:30: warning: returning reference to temporary [-Wreturn-local-addr]
return { 'T', 'E', 'S', 'T' };
Run Code Online (Sandbox Code Playgroud)
在这种情况下警告是否正确?从这样的constexpr函数返回数组是不正确的,即使该函数在运行时从未实际调用过,只是在编译期间?
我想知道在 OpenGL 中(通过扩展或其他方式)是否有可能有一个由glVertexAttribPointer类型函数指定的属性数组,它为每个基元(或 N 个顶点)前进一个而不是每个顶点一个?
例如,如果我有一个三角形数组,它们目前具有纯色,我必须为每个顶点重复相同的颜色数据,我想要的是沿着这些线的东西:
struct pos {
uint8_t x, y;
} positions[NUM_VERTICES];
struct col {
uint8_t r, g, b;
} colors[NUM_VERTICES / 3];
Run Code Online (Sandbox Code Playgroud)
其中的一个元件colors阵列被用于每3个连续的重复使用positions时两个阵列被提交给OpenGL的与元件glVertexAttribPointer和呈示具有单个glDrawArrays(GL_TRIANGLES, ...);
我找到了ARB_instanced_arrays扩展,它提供了glVertexAttribDivisorARB起初看起来很有希望的功能,但我认为它不像我描述的那样工作。
我开始通过使用绝对定位和通过Javascript改变它们的不透明度在3个元素之间进行简单的淡入淡出过渡,但是下面的代码不能像我预期的那样工作,我不确定为什么.
<html>
<head>
<style>
#item0, #item1, #item2 {
opacity: 0.0;
position: absolute;
top: 100px;
left: 100px;
border: 1px solid #000;
height: 200px;
width: 200px;
line-height: 200px;
text-align: center;
vertical-align: middle;
font-size: 26px;
}
#item0 { opacity: 1.0; }
</style>
<script>
var count = 0;
var items;
function init(){
items = document.getElementById("container").getElementsByTagName("div");
setInterval(fade, 5000);
}
function fade(){
fadeElements(items[count], items[(count + 1) % 3]);
count = (count + 1) % 3;
}
function fadeElements(prevItem, nextItem){
prevItem.style.opacity -= 0.1;
nextItem.style.opacity += 0.1;
if(nextItem.style.opacity …Run Code Online (Sandbox Code Playgroud) c++ ×3
gcc ×3
arrays ×1
c ×1
compiler-bug ×1
constexpr ×1
dom ×1
g++ ×1
gcc-warning ×1
html ×1
javascript ×1
opengl ×1