我搜索并阅读了有关此内容但无法理解的内容.
纹理内部格式和调用格式之间的区别是什么
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在这种情况下无效?
我可以使用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++ 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)
这是如何运作的?
我正在使用 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 文档中找不到任何错误描述。我不明白这个错误。
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在这种情况下可以省略(如果可以,为什么?)
这段代码编译但我想知道哪个版本应该是首选的:
#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权限应该没有任何问题?(即没有悬空参考)
为什么我可以将此向量转换为void(甚至不是指针)?
int main()
{
std::vector<int> a;
(void)a;
}
Run Code Online (Sandbox Code Playgroud)
怎么允许这个?
我正在阅读参考折叠规则,我有一个问题:为什么我将rvalue A传递给
template<typename T>
void foo(T&&);
Run Code Online (Sandbox Code Playgroud)
T推断为A?
例如,如果我传递std::string()给函数T被推断为std::string,为什么不std::string&&呢?这对我来说更有意义,推断出T类型本身背后的理由是什么?