小编NoS*_*tAl的帖子

在GCC的"Debug"版本中绑定检查std :: array

std::array专家解释了编程时C++ 11 的优点,但我希望从编译器中获得一些东西.能够打开.at()在编译使用的代码时使用时默认的范围检查[].

检查范围违规尤其是对于多维数组可能是有益的,因为在这种情况下,范围违规不太可能导致segfault(因为你经常在内部数组周围拥有内存,所以[5000][-123]仍然可能指向你拥有的内存).

所以我想知道是否有一个开关可以编译成检查范围的机器代码:

    const uint32_t dim1=10*1000,dim2=3;
    std::array<std::array<int, dim2>, dim1> test_2Darray;
    int undefined_value=test_2Darray[dim2-1][dim1-1];
    std::cout<<"ouch ("<<undefined_value<<")"<<std::endl;
    int ok_value=test_2Darray[dim1-1][dim2-1];
    std::cout<<"OK   ("<<ok_value<<")"<<std::endl;
    //  test_2Darray.at(dim2-1).at(dim1-1); -->terminate called after throwing an instance of 'std::out_of_range'
    //      what():  array::at
Run Code Online (Sandbox Code Playgroud)

如果你问为什么我不切换到.at()- 我可能需要性能,我也有很多[]已编写的代码,而且我不够聪明,不能替代1D更换2D阵列.

我使用GCC 4.6

c++ arrays c++11

8
推荐指数
2
解决办法
2315
查看次数

这是组合std :: generate_n和std :: back_inserter的正确方法吗?

在我的任务:)尽可能多地使用STL我想知道是否可以使用std :: generate和std :: back_inserter组合,以便我可以执行与以下代码相同的操作:

static const size_t nitems=1024*1024;
std::string mrbig;
for (size_t pos=0; pos<nitems; ++pos)
    mrbig.push_back('a'+ (rand()%26));
Run Code Online (Sandbox Code Playgroud)

我试过了

 std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但我想确保我没有弄乱一些东西.

c++ stl c++11

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

ZeroMQ中的N到N异步模式?

虽然我通过了指南,但我无法找到一种方法来执行以下操作:
我们有n个发布者,
我们有m个订阅者.
每个订阅者订阅某种类型的消息(一个发布者可以发送多种消息,多个发布者可以发出相同类型的消息).
如何在0MQ中创建N到N(或N到1到N)模式呢?

zeromq

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

有没有办法在Visual Studio中进行Scala编程?

我有VS 2012终极RC,最近我对Scala感兴趣,所以我想知道是否有一种方法(插件)在VS中进行简单的Scala编程?谷歌搜索显示了一些可能的承诺,但这些信息已超过一年.我知道Scala在JVM上运行,但我提到的信息提到了.Net版本.

.net scala visual-studio

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

哪里可以获得神秘的Microsoft msgtool进行C++序列化


http://msdn.microsoft.com/en-us/devlabs/hh975426.aspx上阅读演员时, 我注意到序列化的部分:

由于序列化对于程序的正确功能至关重要并且很容易出错,因此C++ Actors库包含一个简单的消息定义生成工具"msgtool",给定XML文档将创建必要的类型和序列化定义.

我无法在VS命令提示符中找到msgtool,或使用谷歌搜索.

c++ serialization visual-studio casablanca

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

在移动构造函数中用作arg后,哪些std类型保证为空/ null

我知道shared_ptr,在相同类型的构造函数中用作RVR参数后unique_ptr,weak_ptr保证是空的,但我不知道标准是否为std::我提到的其他类型指定了这个.

请注意,我知道移动后的元素保持有效但未指定的状态,我在这里感兴趣的是指定了哪些类型的状态.

c++ move-semantics c++11 c++14

8
推荐指数
2
解决办法
357
查看次数

为什么std :: swap不使用swap idiom?

正确使用std :: swap是:

using std::swap;
swap(a,b);
Run Code Online (Sandbox Code Playgroud)

它有点冗长,但它确保如果a,b有更好的交换定义它将被选中.

所以现在我的问题是为什么std::swap没有使用这种技术实现,所以用户代码只需要调用std::swap

所以这样的事情(noexcept为了简洁而忽略和约束):

namespace std {
    namespace internal {
        template <class T>      // normal swap implementation
        void swap(T& a, T& b) { // not intended to be called directly
            T tmp = std::move(a);
            a = std::move(b);
            b = std::move(tmp);
        }
    }

    template <class T>
    void swap(T& a, T& b) {
        using internal::swap;
        swap(a,b);
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ template-function argument-dependent-lookup customization-point

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

string_view实现使用pointer,size而不是pointer,pointer有原因吗

您可能知道,C++17 字符串视图可以实现为一对 2 个指针(开始、结束)或指针(开始)和大小。我注意到在一个实现中它是用指针​​、大小来实现的。

这样做有充分的理由吗?或者这只是一个抛硬币的决定?

我想知道,因为向量实现通常有 3 个指针,而不是指针、大小、大小。

我唯一合理的解释是 .size() 可能比 .end() 被调用更频繁,因此我们对此进行优化(end 需要加法,但 size 无需计算)。

c++ optimization c++17

8
推荐指数
0
解决办法
421
查看次数

为什么 std::isnan 不是 constexpr?

从 C++20 开始,std::isnan 不是 constexpr。

这有技术原因吗?

我能想到的只是它在“C 头文件”中,所以没有人费心去修复它(<limits>处理浮点数的函数是 constexpr,但不幸的numeric_limits是不包含 isnan 检查)。

c++ constexpr c++20

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

如何在不编写标识样板的情况下访问 C++23 std::Optional 中包含的值?

我正在使用 C++23std::optional添加,但我不知道如何优雅地访问对象的值(如果optional处于活动状态)。

我知道我可以使用if,但这就是C ++20 。

我真的很喜欢 C++23 API 的变化,但我不知道如何跳过实现身份的样板。例如:

#include <functional>
#include <iostream>
#include <optional>

void print(std::optional<std::string>& name) {
    name.transform([](std::string& x) {
        std::cout << x << std::endl;
        // I just want to print, without modifying optional, but next line is required
        return x;
    });
}

int main() {
    std::optional<std::string> name{{"Bjarne"}};
    print(name);
}
Run Code Online (Sandbox Code Playgroud)

感觉就像std::optional缺少invoke会员功能一样。

注意:在我的示例中,我在转换后不会链接任何其他内容,但为了简洁起见,我关心可选内容是否被修改。

c++ stdoptional c++23

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