小编flm*_*620的帖子

为什么有时局部类无法访问函数作用域中定义的 constexpr 变量

此 C++ 代码无法编译:

#include <iostream>

int main()
{
    constexpr int kInt = 123;
    struct LocalClass {
        void func(){
            const int b = std::max(kInt, 12); 
            //                     ^~~~  
            // error: use of local variable with automatic storage from containing function
            std::cout << b;
        }
    };
    LocalClass a;
    a.func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这有效:

#include <iostream>
#include <vector>

int main()
{
    constexpr int kInt = 123;
    struct LocalClass {
        void func(){
            const int b = std::max((int)kInt, 12); // added an extra conversion "(int)"
            std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++17 c++20

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

-fvisibility-inlines-hidden 与 gcc 中的 -fvisibility=hidden 有何不同

根据http://gcc.gnu.org/wiki/Visibility

使用-fvisibility=hidden,您是在告诉 GCC,每个未显式标记为可见性属性的声明都具有隐藏的可见性。

-fvisibility-inlines-hidden 导致所有内联类成员函数具有隐藏可见性

当我编译一个非常大的项目时,在我看来,-fvisibility-inlines-hidden与使用 with-fvisibility=hidden相比,与 with相加确实可以隐藏更多符号-fvisibility=hidden。但我找不到一个最小的例子来显示生效的确切差异-fvisibility-inlines-hidden。我也试过这个例子,但没有看到后者的效果。

有人可以向我展示一个最低限度的例子,-fvisibility-inlines-hidden如果我已经在使用,它仍然是必要的-fvisibility=hidden吗?我正在使用 GCC 5.3.0

c++ gcc linkage

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

MSVC DLL 导出从模板继承的类导致 LNK2005 已定义错误

我已经跟踪一个大型项目中的错误三天了,终于得到了一个最小的可重现示例。我想分享这个问题,并就 Visual Studio 的奇怪行为提出一些问题。

当您导出从​​实例化模板类继承的类时,例如

class __declspec(dllexport) classA : public Template<double>{}
Run Code Online (Sandbox Code Playgroud)

MSVC还将导出Template<double>DLL中实例化的模板类。

如果消费者"template.h"在他的代码中包含然后同时实例化一个Template<double>, qnd ,链接到上面的DLL,他将得到两个 的定义Template<double>,这会导致LNK2005LNK1169错误。Microsoft DLL 导出和 C++ 模板中讨论了此问题。

这是此问题的最小可重现示例(完整代码位于此处):

// ----------- Project AA ------------
// aa/CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(AA)
add_library(AA SHARED classA.cpp)                          //(1)
set_target_properties(AA PROPERTIES COMPILE_FLAGS "-DBUILD_AA")

// aa/config.h
#pragma once

#ifdef _WIN32
#  ifdef BUILD_AA
#    define AA_API __declspec( dllexport )
#  else
#    define AA_API __declspec( dllimport )
#  endif …
Run Code Online (Sandbox Code Playgroud)

c++ dll templates lnk2005 visual-studio

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

OpenCV 矩阵加法、乘法与浮点和 8 位值的奇怪行为

我正在使用 OpenCV 版本 3.4.5。我试图了解 OpenCV 中的行为cv::Mat。我乘以一些 8 位矩阵并将它们相加。结果似乎不一致。

OpenCV 是否在每次乘法之后或每次加法之后立即将浮点结果转换回 8 位,或者这里可能发生了一些“融合乘加”?

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    for (int value = 1; value < 10; value++) {
        cv::Mat im(1, 1, CV_8U, value);
        cv::Mat result[10];
        result[0] = im*0.1f;
        result[1] = im*0.1f + im*0.1f;
        result[2] = im*0.1f + im*0.1f + im*0.1f;
        result[3] = im*0.1f + im*0.1f + im*0.1f + im*0.1f;
        result[4] = im*0.1f + im*0.1f + im*0.1f + im*0.1f + im*0.1f;
        result[5] = im*0.1f + im*0.1f + im*0.1f …
Run Code Online (Sandbox Code Playgroud)

c++ opencv

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

列表初始化的Python列表

我知道

[[]] * 10
Run Code Online (Sandbox Code Playgroud)

将给出10个相同的空引用,和

[[] for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

将给出10个空列表.但在这个例子中:

def get_list(thing):
  return [thing for i in range(10)]
a = get_list([])
a[0].append(1)
print(a)
Run Code Online (Sandbox Code Playgroud)

为什么结果又来了

[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
Run Code Online (Sandbox Code Playgroud)

编辑:

与问题列表中的更改反映在子列表中的意外不同,我理解Python不会复制[x]*10.

但为什么[]特别[[] for i in range(10)]?我认为这是不一致的.而不是创建一个空列表[]然后传递给[ ___ for i in range(10)]Python,字面意思是"[]"并为每个执行"[]" i.

python list

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

标签 统计

c++ ×4

c++17 ×1

c++20 ×1

dll ×1

gcc ×1

language-lawyer ×1

linkage ×1

list ×1

lnk2005 ×1

opencv ×1

python ×1

templates ×1

visual-studio ×1