小编ein*_*ica的帖子

可以/我应该使用std :: exception来进行常规错误处理吗?

我将用C++开始这个新项目,并且正在考虑一种不痛苦的错误处理方法.现在,我不打算开始抛出和捕获异常,并且很可能永远不会抛出异常,但我在想 - 即使是常规错误处理,为什么要自己滚动/复制粘贴一个类来描述错误/状态,当我可以使用std::exception它的子类(或者也许是一个std::optional<std::exception>)?

using Status = std::optional<std::exception>;
Status somethingThatMayFail(int x);
Run Code Online (Sandbox Code Playgroud)

有人/任何项目是这样工作的吗?这是一个荒谬的想法还是有点吱吱作响?

c++ error-handling idioms idiomatic

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

为什么我不能在模板化的类中内联定义非模板化的朋友?

MCVE的言辞胜于雄辩:

// int bar();
template <bool B> class Foo {
    friend int ::bar() { return 123; }
};

int main()
{
    Foo<false> f1;
    Foo<true> f2;
}
Run Code Online (Sandbox Code Playgroud)

与GCC 6 --std=c++14,这给了我:

a.cpp: In instantiation of ‘class Foo<true>’:
a.cpp:9:12:   required from here
a.cpp:3:13: error: redefinition of ‘int bar()’
  friend int ::bar() { return 123; }
             ^~
a.cpp:3:13: note: ‘int bar()’ previously defined here
Run Code Online (Sandbox Code Playgroud)

现在,我不确定标准是什么意思; 但是我知道编译器知道朋友没有模板化B,也没有使用它的定义B.那么为什么它不能应用"哦,函数的相同定义的所有内联副本是相同的"规则?

c++ templates inline friend language-lawyer

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

如何处理静态存储持续时间警告?

我是一个试图从书中学习C++的新手.下面的代码工作和预期产生输出,但也有定义两行警告enginerandomInt"具有静态存储时间'引擎’的初始化可能会引发无法捕获的异常."

如果我把线7和8的内部main(),警告完全消失,但随后enginerandomInt没有提供给getNumber.

我不知道如何修复警告.另外,也许更重要的是,randomInt在各个地方使用的正确方法是什么main()?声明它main()然后根据需要将它传递给函数是否合适?不知怎的main(),感觉不适合宣布这些类型的东西.

我之前问了一个与此类似的问题,但我仍然在努力理解,并提供了一个希望有用的例子.

// Loosely based on Fig. 6.12: fig06_12.cpp, C++ How To Program, Ninth Edition

#include <iostream>
#include <iomanip>
#include <random>

std::default_random_engine engine( static_cast<unsigned int>( time(nullptr) ) );
std::uniform_int_distribution<unsigned int> randomInt( 1, 6 );

int getNumber();

int main() {
    for ( unsigned int counter = 1; counter <= 10; ++counter ) {
        std::cout << std::setw( 10 ) << …
Run Code Online (Sandbox Code Playgroud)

c++ global-variables c++11

7
推荐指数
2
解决办法
6337
查看次数

在C++中,为什么"new"需要动态创建一个对象而不仅仅是分配?

我有这个琐碎的类层次结构:

class Base {
public:
    virtual int x( ) const = 0;
};

class Derived : public Base {
    int _x;
public:
    Derived( int x ) : _x(x) { }
    int x( ) const { return _x; }
};
Run Code Online (Sandbox Code Playgroud)

如果我malloc用来分配一个实例Derived,然后尝试访问多态函数x,程序崩溃(我得到一个分段错误):

int main( ) {
    Derived *d;
    d = (Derived*) malloc( sizeof(Derived) );
    *d = Derived( 123 );

    std::cout << d->x() << std::endl; // crash

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然我的实际应用程序要复杂得多(它是一种内存池).


我很确定这是因为我分配的方式d:我没有使用new.

我知道 …

c++ memory malloc alignment new-operator

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

mercurial颜色扩展的有效颜色是什么?

Mercurial的color 扩展很棒,但是在该页面上没有列出有效颜色的列表.我找了一个名为color的python文件,希望我能够阅读源代码并在那里看到它,但没有运气.我希望使用灰色或浅灰色作为颜色,但它无效.灰色(或灰色)似乎很可能是颜色列表中的颜色.

我在哪里可以找到color扩展名的有效颜色列表?或者我在哪里可以找到color扩展的来源?

mercurial colors ansi-term

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

我如何获得'make uninstall'来删除空目录和文件?

当我使用make uninstall它卸载一个应用程序时,会留下一些make install已经创建的空目录,例如/usr/share/foo/和它的子目录/usr/share/foo/applications等等.

我通过Google发现,automake生成的uninstall目标不会自动删除空目录,因为它不知道应用程序是否拥有目录(例如,它是否在其中创建make install),或借用它(例如,存在期间的目录make install).

目前我的make文件都没有确定的uninstall目标,隐式似乎知道它必须删除哪些文件.如何教它还删除有问题的文件夹?

automake uninstall

6
推荐指数
2
解决办法
2240
查看次数

在 CUDA 中交换两个寄存器变量的有效方法是什么?

我开始写一些 CUDA 代码,我想对std::swap()内核中的两个变量做等价的;它们在寄存器文件中(没有溢出,不在某些缓冲区中,等等)。假设我有以下设备代码:

__device__ foo(/* some args here */) {

    /* etc. */

    int x = /* value v1 */;
    int y = /* value v2 */;

    /* etc. */

    swap(x,y);

    /* etc. */
}        
Run Code Online (Sandbox Code Playgroud)

现在,我可以写

template <typename T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
Run Code Online (Sandbox Code Playgroud)

但我想知道 - 不是有一些内置的 CUDA 用于此功能吗?

笔记:

  • 是的,我希望它为所有线程运行。
  • 不要在意我是否有足够的寄存器。假设我有它们。

c++ swap cuda

6
推荐指数
2
解决办法
4578
查看次数

为什么我对CUDA数学库sqrt()函数的调用失败了?

我是Cuda的新手,我有以下功能:

__global__ void square(float *myArrayGPU)
{
   myArrayGPU[threadIdx.x] = sqrt(threadIdx.x);
}
Run Code Online (Sandbox Code Playgroud)

我想使用cuda数学库,我试过,#include "math.h"但我仍然得到错误

error: calling a __host__ function("__sqrt") from a __global__ function("square") is not allowed

知道我应该包含哪些库来使用sqrt

c c++ math cuda square-root

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

clang的uint24_t如何工作?我可以在clang/LLVM之外使用它吗?

作为一名GCC用户,我刚刚注意到clang支持一种uint24_t类型(stdint.h无论如何都是这样).

这是如何运作的?我的意思是,它是纯粹在内部支持,作为语言扩展,还是像C++类一样实现,有一些抽象超过3个字节或16位值和另一个8位值?并且 - 如何可能"猛拉"这样的实现并自己使用GCC?

注意:

  • 我希望在现代C++(或uint_t<N>更普遍的)中有类似uint24_t的类; 我的选择是自己动手.
  • s/uint/int/g;如果你喜欢这个问题,你可以.

c++ gcc clang

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

-Wformat-truncation - 我可以避免它而不是禁用警告吗?

我正在编写这段代码,其中包含以下行:

\n\n
snprintf(target, 11, "%02ld-%02ld-19%02ld", day, month, year);\n
Run Code Online (Sandbox Code Playgroud)\n\n

...在验证所有 3 个值都有效后执行;具体来说,该年份介于 0 到 99 之间。

\n\n

然而,最新版本的 GCC 在使用 运行时-Wextra会抱怨:

\n\n
warning: \xe2\x80\x98%02ld\xe2\x80\x99 directive output may be truncated writing between 2 and 20 bytes\ninto a region of size 3 [-Wformat-truncation=]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我宁愿不完全禁用此警告;甚至也不能在本地禁用它。相反,我想知道是否可以以某种方式“说服”GCC 这三个参数的值范围,从而防止出现警告。

\n\n

是的,这是相当丑陋的重新发明轮子的代码,应该使用特定于区域设置的日期格式化例程,不需要教训我;不是我的代码。

\n

c printf gcc-warning format-truncation

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