小编LB-*_*B--的帖子

添加`noexcept(false)`会以任何方式使代码受益吗?

最近在我的代码中,我已经明确地编写noexcept(false)了我知道会抛出异常的函数,主要是为了阅读代码的人.但是,我想知道这是否会影响我的代码行为或编译器解释它的方式.它有什么不同吗?

注意:我知道析构函数是隐式noexcept,你必须指定noexcept(false)更改它,我想知道其他函数.

c++ noexcept c++11

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

我可以将std :: begin和std :: end专门用于equal_range()的返回值吗?

所述<algorithm>头部提供std::equal_range(),以及具有作为它的成员函数的一些容器.让这个函数困扰我的是它返回一对迭代器,使得从开始迭代器迭代到结束迭代器变得繁琐.我希望能够使用std::begin(),std::end()以便我可以使用基于C++ 11范围的for循环.

现在,我听到关于矛盾的信息,以专业std::begin()std::end()-我已经被告知,添加什么不确定的行为std命名空间的结果,而我也被告知,你可以提供自己的专长std::begin()std::end().

这就是我现在正在做的事情:

namespace std
{
    template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
    Iter begin(pair<Iter, Iter> const &p)
    {
        return p.first;
    }
    template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
    Iter end(pair<Iter, Iter> const &p)
    {
        return p.second;
    }
}
Run Code Online (Sandbox Code Playgroud)

这确实有效:http://ideone.com/wHVfkh

但我想知道,这样做的缺点是什么?有一个更好的方法吗?

c++ iterator stl template-specialization c++11

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

是什么原因导致这个构造函数在获取初始化列表并委托向量时委托给自己?

#include <initializer_list>
#include <vector>

struct test
{
    using t = std::vector<test>;
    test(t const &v)
    {
    }
    test(t &&v)
    {
    }
    test(std::initializer_list<test> v)
    : test{t{v}} //error
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

无论GCC抱怨说,第三个构造函数,一个以初始化列表中,代表们本身.我不明白这是怎么可能的,因为你无法从向量构造初始化列表.

通过用圆括号替换外部花括号来修复错误是微不足道的,但为什么这首先是一个问题呢?这几乎相同的程序编译得很好:

#include <initializer_list>

struct a {};
struct b {};

struct test
{
    test(a const &)
    {
    }
    test(a &&)
    {
    }
    test(std::initializer_list<b> v)
    : test{a{}} //no error, still using curly braces
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

有趣的是,使用上面的第二个例子,如果你用替换b,错误会重新出现test.有人能解释一下这里发生了什么吗?

c++ c++11 c++14

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

在C中使用pow时,CMake是否可以检测是否需要链接到libm?

对于某些编译器,在C程序中使用pow和某些其他功能需要链接到m.但是,某些编译器不需要这样做,并且在链接到m库时会出错.对于带有std::thread和的C++,存在几乎完全相同的情况pthread,但是CMake模块FindThreads完全缓解了这种情况 - 是否有一些类似于libm的模块?

检测CMake如何处理的最佳方法是什么?这是我目前的解决方案,这不太理想,因为有更多的C编译器,而不仅仅是GCC和MSVC:

if(NOT MSVC)
    target_link_libraries(my-c-target PUBLIC m)
endif()
Run Code Online (Sandbox Code Playgroud)

这适用于我的目的,但我很确定有些情况会失败并需要手动用户干预,这对于不了解这种默默无闻的人来说并不好玩.理想情况下,我不希望用户必须通过命令行指定他们的编译器是否很奇怪 ; 我想在CMake中自动检测它,因为这是CMake的全部内容.

c gcc cmake libm

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

执行外部程序的简单 C++ 跨平台方式

在 C++ 中执行外部程序并从中获取返回码的简单、优雅且有效的跨平台方式是什么?

int execute(std::string const &path, std::vector<std::string> const &arguments = {})
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

由于我们在继续执行之前等待被调用程序完成,因此被调用程序应该使用我们程序的输入/输出/错误流。如果由于多种原因path不能执行,只需抛出异常(例如std::invalid_argument)。

显然,不要使用system().

c++ cross-platform

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

std :: make_signed接受浮点类型

我有一个模板类,只能为标量类型(整数,浮点数等)实例化,我希望成员typedef始终是该类型的有符号变体.那是:

unsigned int- > signed int
signed long long- > signed long long(已签名)
unsigned char- > signed char
float- > float
long double- >long double
等...

不幸的是,std::make_signed只适用于整数类型,而不适用于浮点类型.最简单的方法是什么?我正在寻找形式的东西,成为using SignedT = ...;模板参数T的模板化类的一部分已经保证是标量.

c++ templates type-traits c++11

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

替代PImpl成语 - 优势与劣势?

传统的PImpl Idiom是这样的:

#include <memory>

struct Blah
{
    //public interface declarations

private:
    struct Impl;
    std::unique_ptr<Impl> impl;
};

//in source implementation file:

struct Blah::Impl
{
    //private data
};
//public interface definitions
Run Code Online (Sandbox Code Playgroud)

但是,为了好玩,我尝试使用具有私有继承的组合:

[Test.h]

#include <type_traits>
#include <memory>

template<typename Derived>
struct PImplMagic
{
    PImplMagic()
    {
        static_assert(std::is_base_of<PImplMagic, Derived>::value,
                      "Template parameter must be deriving class");
    }
//protected: //has to be public, unfortunately
    struct Impl;
};

struct Test : private PImplMagic<Test>,
              private std::unique_ptr<PImplMagic<Test>::Impl>
{
    Test();
    ~Test();
    void f();
};
Run Code Online (Sandbox Code Playgroud)

[第一个翻译单位]

#include "Test.h"
int main() …
Run Code Online (Sandbox Code Playgroud)

c++ pimpl-idiom composition object-composition c++11

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

C++ 14结合了通用lambdas和变量模板

我知道泛型lambda,我知道变量模板,但是,这有什么作用?它甚至被允许了吗?

template<typename T>
auto f = [](auto a, T b){ /**/ };
Run Code Online (Sandbox Code Playgroud)

如果允许,可以按预期使用吗?那就是f<type>(var_a, var_b)

c++ lambda templates generic-lambda c++14

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

删除HTML/CSS中的边框偏移量

<p>Hello</p>
<p>Hello</p>
<p><span style="border: 5px dotted blue; border-radius: 1em;">Hello</span></p>
<p>Hello</p>
<p>Hello</p>
Run Code Online (Sandbox Code Playgroud)

在Chrome中呈现:

在chrome中呈现

渲染时,边框"占用空间"并抵消内容的位置以及增加内容所需的大小.有没有办法让边界这样做?也就是说,边框没有边框的任何间距/填充效果?

期望的效果是内容总是在相同位置,无论它是否具有边界(例如,上面截图中的所有H将具有相同的水平对齐).我可以接受重叠内容的边框以及向外延伸,但如果可能的话,我想知道如何做到这两点.

我已经考虑过在不需要时使边框始终存在但是透明,但这会使间距和填充非常麻烦,我想要有不同大小的边框.

注:我能如果需要使用CSS3和HTML5.

html css

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