小编voi*_*ter的帖子

我什么时候应该使用noexcept?

noexcept关键字可以适当地应用于许多功能签名,但我不能确定何时我应该考虑在实践中使用它.根据我到目前为止所读到的内容,最后一分钟的添加noexcept似乎解决了移动构造函数抛出时出现的一些重要问题.但是,我仍然无法对一些实际问题提供令人满意的答案,这些问题使我首先要了解更多信息noexcept.

  1. 我知道永远不会抛出许多函数的例子,但编译器无法自行确定.noexcept所有这些情况下我应该附加到函数声明吗?

    不得不考虑我是否需要noexcept每个函数声明之后追加,这将大大降低程序员的工作效率(坦率地说,这将是一个痛苦的屁股).对于哪些情况,我应该更加小心使用noexcept,以及在哪些情况下我可以使用暗示noexcept(false)

  2. 我何时才能真实地期望在使用后观察到性能提升noexcept?特别是,给出一个代码示例,C++编译器在添加之后能够生成更好的机器代码noexcept.

    就个人而言,我关心的是noexcept因为编译器提供了更大的自由来安全地应用某些类型的优化.现代编译器是否noexcept以这种方式利用?如果没有,我可以期待他们中的一些人在不久的将来这样做吗?

c++ exception-handling exception noexcept c++11

472
推荐指数
8
解决办法
9万
查看次数

在C++中方便地声明编译时字符串

能够在C++编译时创建和操作字符串有几个有用的应用程序.尽管可以在C++中创建编译时字符串,但是该过程非常麻烦,因为字符串需要声明为可变字符序列,例如

using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>;
Run Code Online (Sandbox Code Playgroud)

诸如字符串连接,子字符串提取等许多操作可以很容易地实现为对字符序列的操作.是否可以更方便地声明编译时字符串?如果没有,是否有一个提案可以方便地声明编译时字符串?

为什么现有方法失败

理想情况下,我们希望能够如下声明编译时字符串:

// Approach 1
using str1 = sequence<"Hello, world!">;
Run Code Online (Sandbox Code Playgroud)

或者,使用用户定义的文字,

// Approach 2
constexpr auto str2 = "Hello, world!"_s;
Run Code Online (Sandbox Code Playgroud)

哪里decltype(str2)有一个constexpr构造函数.方法1的混乱版本可以实现,利用您可以执行以下操作的事实:

template <unsigned Size, const char Array[Size]>
struct foo;
Run Code Online (Sandbox Code Playgroud)

但是,数组需要有外部链接,所以要使方法1起作用,我们必须编写如下内容:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ string metaprogramming user-defined-literals c++11

131
推荐指数
8
解决办法
6万
查看次数

GAS:.cfi_def_cfa_offset的说明

我想解释一下GCC生成的汇编中.cfi_def_cfa_offset指令使用的值.我隐约知道.cfi指令涉及调用帧和堆栈展开,但我想更详细地解释为什么,例如,在编译以下C程序时GCC输出的汇编中使用值16和8的原因在我的64位Ubuntu机器上.

C程序:

#include <stdio.h>

int main(int argc, char** argv)
{
        printf("%d", 0);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在源文件test.c上调用了GCC,如下所示:gcc -S -O3 test.c.我知道-O3可以实现非标准优化,但为了简洁起见,我想限制生成的程序集的大小.

生成的程序集:

        .file   "test.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "%d"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
.LFB22:
        .cfi_startproc
        subq    $8, %rsp
        .cfi_def_cfa_offset 16
        xorl    %edx, %edx
        movl    $.LC0, %esi
        movl    $1, %edi
        xorl    %eax, %eax
        call    __printf_chk
        xorl    %eax, %eax
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        ret
            .cfi_endproc
.LFE22:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
        .section        .note.GNU-stack,"",@progbits …
Run Code Online (Sandbox Code Playgroud)

assembly callstack gnu-assembler dwarf

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

为什么`std :: initializer_list`没有提供下标运算符?

假设您正在编写一个接受被std::initializer_list调用list的函数,并且该函数需要随机访问其list元素.写list[i]代替是方便的list.begin()[i].那么为什么不std::initializer_list提供定义operator[]呢?

我想不出任何operator[]返回const T&不明确的情况.效率在这里似乎不是问题,因为std::initializer_list<T>::iterator别名const T*,显然是随机访问迭代器.

c++ iterator operator-overloading initializer-list c++11

35
推荐指数
2
解决办法
8163
查看次数

C++ 11是否具有动态分配数组的包装器,如Boost的scoped_array?

我经常需要在C++中处理动态分配的数组,因此依赖于Boost for scoped_array,shared_array等.在阅读了Stroustrup的C++ 11 FAQC++ 11 Reference Wiki之后,我无法找到C++ 11标准提供的这些动态数组包装器的合适替代品.有什么东西我忽略了,还是我必须继续依赖Boost?

非常感谢您的帮助!

boost memory-management smart-pointers wrapper c++11

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

`static constexpr auto` data-member用未命名的枚举初始化

我正在使用C++ 11项目clang++-3.4,并决定编译使用g++-4.8.2,以防产生的错误有任何差异.事实证明,g ++拒绝了一些clang ++接受的代码.我已将问题减少到下面给出的MWE.


enum { a };

template <class T>
struct foo
{
    static constexpr auto value = a;
};

int main()
{
    static constexpr auto r = foo<int>::value;
}
Run Code Online (Sandbox Code Playgroud)

foo.cpp:5:23:错误:' const<anonymous enum> foo<int>::value',使用匿名类型声明,但是使用但从未定义[-fpermissive]

static const auto value = A;
Run Code Online (Sandbox Code Playgroud)

我想帮助回答以下两个问题:

  • 哪个编译器在解释标准时是正确的?我假设一个编译器正确接受或拒绝代码,另一个是错误的.

  • 我该如何解决这个问题?我无法命名匿名枚举,因为它来自第三方库(在我的情况下,枚举是Eigen::RowMajorEigen::ColMajor).

c++ enums language-lawyer auto c++11

26
推荐指数
3
解决办法
4419
查看次数

Vim:转到下一个方法的开始/结束

Vim中是否有本机功能允许用户将光标移动到下一个方法的开头/结尾?我已经知道了[[,]],[],和][,但这些不切的工作,因为他们只对处于零柱支撑工作.因此,它们在导航C++代码方面几乎没有用处.是否有这样的命令已经内置到Vim中?如果没有,你会推荐一个实现它的插件吗?

谢谢你的帮助!

编辑:[{并且}]不会一直工作,因为你必须在块内{}(并且不在该块内的某个更深的范围内),以便最终在右边{}之后.

编辑2:这是一个代码清单,其中[m和朋友不工作.

namespace foo {

#define define_foo         \
    template <class T>     \
    struct foo_traits<X>   \
    {                      \
        using foo = X;     \
    };

template <class T>
struct foo_traits;

define_bar(T*, T*, T*);

template <class T>
struct baz;

template <class T>
struct baz<T&>
{
    static T* apply(T& t) { return &t; }
};

template <class T>
inline T a(T t) …
Run Code Online (Sandbox Code Playgroud)

c++ java methods vim

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

以下代码是否会导致c ++中的内存泄漏

class someclass {};

class base
{
    int a;
    int *pint;
    someclass objsomeclass;
    someclass* psomeclass;
public:
    base()
    {
        objsomeclass = someclass();
        psomeclass = new someclass();
        pint = new int(); 
        throw "constructor failed";
        a = 43;
    }
}

int main()
{
    base temp();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,构造函数抛出.哪些对象会泄露,以及如何避免内存泄漏?

int main()
{
    base *temp = new base();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中怎么样?构造函数抛出后如何避免内存泄漏?

c++ constructor memory-leaks exception

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

C++ 11:Nonmember rbegin()/ rend()函数

由于在C++ 11修订版中为标准包含添加了非成员begin()end()函数,为什么还没有添加rbegin()和成员的非成员版本rend()?在开始使用非成员版本之后我感到愚蠢,begin()并且end()发现我现在必须在使用成员函数和非成员函数调用之间切换.(我知道这将是微不足道的推出我自己的非成员版本rbegin()rend(),但我不知道为什么这不是添加到标准).

感谢您的输入.

c++ iterator stl c++11

17
推荐指数
2
解决办法
2026
查看次数

部分模板专业化的g ++ Bug

我正在为g ++(版本4.8.1_1,Macports)和clang ++(版本3.3,Macports)编写一些TMP密码.虽然g ++拒绝使用UNBRIDLED FURY的以下代码清单,但是 clang ++会用优雅辉煌来编译它.

  • 哪个编译器在右边?(我强烈怀疑它是g ++,但我希望在提交错误报告之前得到其他人的一些保证.)
  • 您有任何简单或优雅的变通方法可供建议吗?(我需要使用模板别名,因此切换到结构,导致g ++接受代码,不是一个选项.)

这是代码清单,专为您而制作.

template <class... Ts>
struct sequence;

template <int T>
struct integer;

// This definition of `extents` causes g++ to issue a compile-time error.
template <int... Ts>
using extents = sequence<integer<Ts>...>;

// However, this definition works without any problems.
// template <int... Ts>
// struct extents;

template <int A, int B, class Current>
struct foo;

template <int A, int B, int... …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization c++11 template-aliases

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