小编Ker*_*g73的帖子

属性可以应用于构造函数参数吗?

Clang 8.0.0 和 GCC 9.1.0 似乎不同意这是否是有效代码。

struct Foo {
  Foo([[maybe_unused]] int x) {}
};
int main() {}
Run Code Online (Sandbox Code Playgroud)

Clang 不产生警告(即使使用-Wall -Wextra -Wpedantic),但 GCC 产生此错误:

test.cpp:2:7: error: expected unqualified-id before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |       ^
test.cpp:2:7: error: expected ')' before '[' token
    2 |   Foo([[maybe_unused]] int x) {}
      |      ~^
      |       )
Run Code Online (Sandbox Code Playgroud)

那么哪个编译器有错误?

c++ language-lawyer compiler-bug

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

如何处理 PNG 文件中的伽马校正和颜色?

我正在开发一个图像绘制程序,但我对色彩空间感到非常困惑。我对伽玛的了解越多,我知道的就越少(没有多大帮助)。

在内部,绘图程序会将图像存储为 8 位 sRGB,然后转换为 16 位线性进行合成和过滤操作。也许我应该存储 16 位线性,然后在导出时转换为 8 位 sRGB?我很想在这方面提供一些建议。目前,我不确定 Qt 将 RGB 像素解释为什么颜色空间!

据我了解,sRGB 接近大多数显示器使用的色彩空间,因此从 sRGB 转换到显示器色彩空间不会对图像数据产生太大影响。查看 sRGB 数据,就好像它在正确的色彩空间中一样可能会非常接近。

目标

绘图程序显示 sRGB 图像。我想将这些 sRGB 图像保存到 PNG 文件中。当我在创建图像的同一台计算机上打开这个 PNG 文件(在 Mac 上使用预览)时,它看起来应该与艺术家在绘图程序中看到的完全一样,并且具有相同的颜色值(用数字颜色检查仪表)。不同的显示器和不同的操作系统使用不同的色彩空间。这些色彩空间可能不“适合”用于创建图像的系统的色彩空间。当我在不同的显示器甚至不同的计算机上打开 PNG 时,图像应该看起来尽可能与原始图像相似,但可能具有不同的颜色值。

实验

绘图程序似乎正确显示图像(我认为)。问题是PNG。我正在使用 Qt 并使用QImage::save. 如果我需要更多控制,我愿意使用 libPNG。

为了测试,我正在绘制一个 5x5 的图像,其中0 63 127 191 255包含红色和绿色的颜色值。

绘图程序截图

当我使用 Digital Color Meter 对绘图程序渲染的图像进行采样时,像素值没有变化。3,3使用 DCM 采样的像素191 191 0应该是这样。每个像素之间都有明显的对比。

当我截取屏幕截图时,屏幕截图文件中的像素值不同。3,3在预览中查看时使用 DCM 采样的像素为192 191 0. 3,3存储在文件中的像素是 …

c++ qt png colors libpng

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

链接 LLVM 导致 gcov 失败

--coverage在链接 LLVM 的同时传递给 gcc 会导致undefined reference to `__gcov_exit'链接器出错。我已经建立了一个新项目来尝试隔离这个问题。您可以在 github 上查看源代码在 Travis-CI 上检查编译器输出

这是覆盖和非覆盖构建之间的区别

-DCMAKE_CXX_FLAGS="--coverage"
Run Code Online (Sandbox Code Playgroud)

这是 LLVM 和非 LLVM 构建之间的区别

target_link_libraries(Test
        PUBLIC
        LLVMCore
)
Run Code Online (Sandbox Code Playgroud)

LLVM作业成功。该Coverage作业成功。该LLVM + Coverage作业失败,出现此错误

undefined reference to `__gcov_exit'
Run Code Online (Sandbox Code Playgroud)

c++ gcc cmake llvm gcov

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

fillRect在HTML画布中绘制错误的形状

canvas在Chrome应用中使用了html 元素,但fillRect无法正常工作。它打印出一个实心矩形,但不正确。

我这样做:

var c = document.getElementById("canvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "#FF0000";
ctx.fillRect(20, 20, 150, 100);
Run Code Online (Sandbox Code Playgroud)

但它看起来像这样:

看起来像这样

它应该看起来像这样

它应该看起来像这样

这是什么问题?

CSS?

#canvas {
  width: 896px;
  height: 896px;
  background-image: url('assets/underlays/transUnderlay_28.png');
}
Run Code Online (Sandbox Code Playgroud)

HTML?

<td>
  <div id='canvasWrapper'>
    <canvas id='canvas'></canvas>
  </div>
</td>
Run Code Online (Sandbox Code Playgroud)

html canvas

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

使用现代 LLVM 运行默认优化管道

我正在使用 LLVM 7,并且我llvm::Module想使用标准优化管道对其进行优化。不幸的是,没有llvm::runDefaultOptimizations我可以调用的函数。似乎有无数种方法可以优化 LLVM 中的模块。我在这个主题上的搜索发现了许多旧的/折旧的 API 和一些在我的系统上不起作用的示例。

我想以-O3尽可能少的麻烦来运行所有标准优化。我不想手动列出所有的通行证,甚至不想写一个 for 循环。我认为llvm::PassBuilder::buildModuleOptimizationPipeline可能是解决方案,但是当我尝试使用该函数时出现链接器错误,我认为这很奇怪。

c++ llvm clang llvm-c++-api

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

是什么导致不调用移动赋值运算符?

我正在研究自己的智能指针,遇到了一些奇怪的问题.未调用移动赋值运算符.所以我写了一个测试类,并能够重现这个问题.不调用移动赋值运算符,但会发生复制赋值(即使没有复制赋值运算符).

这是我的测试课

#include <utility>
#include <iostream>

struct tag_t {};
constexpr tag_t tag {};

template <typename T>
struct Foo {
  Foo() noexcept
    : val{} {
    std::cout << "Default construct\n";
  }
  template <typename U>
  Foo(tag_t, const U &val) noexcept
    : val{val} {
    std::cout << "Construct " << val << '\n';
  }
  ~Foo() noexcept {
    std::cout << "Destruct " << val << '\n';
  }

  template <typename U>
  Foo(Foo<U> &&other) noexcept
    : val{std::exchange(other.val, U{})} {
    std::cout << "Move construct " << val << '\n'; …
Run Code Online (Sandbox Code Playgroud)

c++ move move-semantics c++17

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

unique_ptr&lt;T,Deleter&gt; 构造函数要求 Deleter 不抛出

unique_ptr(构造函数)@cppreference

unique_ptr( pointer p, /* see below */ d1 ) noexcept;
(3) 
unique_ptr( pointer p, /* see below */ d2 ) noexcept;
(4)
Run Code Online (Sandbox Code Playgroud)

这里有 2 个构造函数,Deleter 案例的描述是非参考的

a) If D is non-reference type A, then the signatures are:
unique_ptr(pointer p, const A& d) noexcept;
(1) (requires that Deleter is nothrow-CopyConstructible)
unique_ptr(pointer p, A&& d) noexcept;
(2) (requires that Deleter is nothrow-MoveConstructible)
Run Code Online (Sandbox Code Playgroud)

我检查了 gcc 和 llvm 代码,但我没有看到nothrow强制要求。构造函数 3-4 被标记,noexcept因此Deleter在调用其构造函数时不应抛出是有道理的。但我不确定为什么在他们提供的示例中,构造函数没有标记为noexcept.

struct D { // …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer noexcept c++17

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

简化容器内部的比例

假设给定一个比率容器,并且您想将比率简化为最低整数。

输入:

std::vector<int> v1 = { 10, 20 , 30, 40 };
Run Code Online (Sandbox Code Playgroud)

输出:

1,2,3,4
Run Code Online (Sandbox Code Playgroud)

如何解决n个大小的容器呢?我正在寻找通用解决方案,该解决方案适用于任何数量的元素和任何整数值。

c++ c++17

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