小编Joa*_*rén的帖子

在GCC,Clang和MSVC中编译类模板参数的特化,但GCC选择了另一个特化

我在Clang 8.0.0,MSVC v19.20和GCC 8.3中成功编译了以下SSCCE代码段。MSVC和Clang都会使程序返回0,而GCC会使程序返回1(godbolt),所以两者之间存在差异,我不知道哪个编译器会产生正确的输出。

#include <type_traits>

template<typename T>
struct Foo {
    template <typename U>
    using inner = Foo<U>;
};

template<template<typename ...Ts> typename>
struct is_foo_template : std::false_type {};
template<>
struct is_foo_template<Foo> : std::true_type {};

template<typename T>
struct is_foo : is_foo_template<T::template inner> {};

int main() {
    return is_foo<Foo<int>>::value;
}
Run Code Online (Sandbox Code Playgroud)

我认为该代码段返回is_foo<Foo<Int>>::value,但是值是std::true_type::value还是std::false_type::value取决于是否选择了Foo-specialization is_foo_template。但是从main上面返回的所有三个编译器返回的值都不相同,因此在我看来并非所有编译器都选择相同的专业化。

问题:根据标准,应该选择Foo专业化还是应该选择非专业模板声明?

c++ templates template-specialization language-lawyer

9
推荐指数
0
解决办法
78
查看次数

ldd 输出静态链接在共享库上

我正在尝试创建一个共享库 libddv3djava.so

我为 libddv3djava.so 编译源代码,如下所示:

~/Programming/intellijprojects/ddv3dbindingstest/src $ g++ -c -Wall -Werror -I. -I /usr/lib/jvm/java-8-oracle/include/ -I /usr/lib/jvm/java-8-oracle/include/linux/ -fpic com_ddv3d_Ddv3dBinding.cpp
Run Code Online (Sandbox Code Playgroud)

创建 libddv3djava.so:

~/Programming/intellijprojects/ddv3dbindingstest/src $ g++ -shared -o libddv3djava.so com_ddv3d_Ddv3dBinding.o
Run Code Online (Sandbox Code Playgroud)

当我在 libddv3djava.so 上执行 ldd 时:

~/Programming/intellijprojects/ddv3dbindingstest/src $ ldd libddv3djava.so         statically linked
Run Code Online (Sandbox Code Playgroud)

问题:

它说 libddv3djava.so 是静态链接的。我libddv3djava.so创造了-shared所以这让我感到困惑。

题:

当 libddv3djava.so 不是静态链接时,为什么ldd输出静态链接?

附加信息:

我不确定以下内容是否相关,但可能是;libddv3djava.so 依赖于我创建的另一个名为 libddv3d.so 的共享库。基本上,libddv3djava.so 是围绕 libddv3d.so 的 JNI 包装器。发帖来源:

com_ddv3d_Ddv3dBinding.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface shared-libraries ldd

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

glDrawElements只绘制由indices指定的第一个三角形

我刚刚开始学习OpenGL,我在使用glDrawElements时遇到了一些麻烦.我试图使用带有GL_TRIANGLE的glDrawElements绘制两个三角形,但只出现一个三角形.

预期结果:glDrawElements绘制两个带顶点的三角形

(0,0)(1,1)(-1,1)和(0,0)( - 1,-1)(1,-1)

会发生什么:glDrawElements绘制一个带顶点的三角形(0,0)(1,1)( - 1,1)

短,自包含,正确(可编译),示例:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main(int argc, char *argv[])
{
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(640, 480, "Sample code does not display two triangles", NULL, NULL);
    glfwMakeContextCurrent(window);

    glewInit();

    GLfloat vertices[] {
        +0.0f, +0.0f, //0
        +1.0f, +1.0f, //1
        -1.0f, +1.0f, //2
        -1.0f, -1.0f  //3
        +1.0f, -1.0f  //4
    };

    GLuint vertexBufferID;
    glGenBuffers(1, &vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    GLuint indexBufferID;
    GLushort indices[] {0,1,2, 0,3,4}; …
Run Code Online (Sandbox Code Playgroud)

c++ opengl

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

固定大小和零初始化数组作为 C++11 中的默认参数

上下文:我认为使用以下编译的SSCCEcompile: g++ -std=c++11 main.cpp将对固定大小的数组进行零初始化arr

void foo(int arr[4] = {0}) { }

int main(int argc, char const *argv[]) {
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,我调试gdb并发现arr = 0x0(空)。我(疯狂地)猜测这是因为int arr[4]很像,int* arr但另外告诉编译器只允许长度为 4 的数组。因此,实际发生的情况是,int arr* = {0}即我只是使用初始化列表来对指针进行零初始化。

我知道我可以通过恢复使用重载而不是默认参数来规避这个问题:

void foo(int arr[4]) { }

void foo() {
    int arr[4] = {0};
    foo(arr);
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这确实给了我一个零初始化的固定大小数组foo。然而,我认为通过使用一些默认参数将这两个重载函数合并为一个函数会很好,类似于 SSCCE。

问题:C++11 中默认参数固定大小数组的零初始化是否可行。如果是这样,怎么办?

c++ arrays initializer-list default-arguments c++11

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