小编nwp*_*nwp的帖子

为什么Stroustrup在"The C++ Programming Language 3rd Edition(online)"中定义了sqrt函数?

Bjarne Stroustrup在他的书"The C++ Programming Language"第2章第23页(pdf第34页)的第3版(在线)中,在一个片段范例中定义了该函数sqrt.为什么他不只是使用已经包含在标准库中的那个?

c++

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

功能的扣除指南作为模板参数

我们可以使用std::unique_ptr将与分配的指针malloc将被free适当天. 但是,结果std::unique_ptr的大小将是2个指针,一个用于指向对象的指针,一个用于指向删除函数的指针,而不是通常的指向对象的指针和隐式指针delete.正如一个答案所指出的那样,可以通过编写Unique_ptr知道正确删除函数的自定义来避免这种情况.可以使用模板参数使该函数知道,以支持任何删除函数,如下所示:

template <class T, void (*Deleter)(T *)>
struct Unique_ptr {
    explicit Unique_ptr(T *t, void (*)(T *))
        : t{t} {}
    ~Unique_ptr() {
        Deleter(t);
    }
    //TODO: add code to make it behave like std::unique_ptr

    private:
    T *t{};
};

template <class T>
void free(T *t) {
    std::free(t);
}

char *some_C_function() {
    return (char *)malloc(42);
}

int main() {
    Unique_ptr<char, free> p(some_C_function(), free); //fine
    Unique_ptr q(some_C_function(), free);             //should be fine
                                                       //with …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-argument-deduction c++17

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

在堆上分配vs在递归函数中在堆栈上分配

当我定义一个递归函数时,在堆上分配局部变量,然后在函数返回之前清除它们比在堆栈上分配它们更好/更安全.嵌入式系统上的堆栈大小非常有限,当递归运行得太深时,存在堆栈溢出的危险.

c c++ embedded recursion memory-management

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

sizeof std :: aligned_storage和std :: aligned_union

给出以下代码:

#include <iostream>
#include <type_traits>

int main() {
    std::aligned_storage<sizeof(double), alignof(double)> storage;
    std::aligned_union<sizeof(double), double> union_storage;
    std::cout << sizeof(storage) << '\n';
    std::cout << sizeof(union_storage) << '\n';
    std::cout << sizeof(double) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我期望sizeof(storage)并且sizeof(union_storage)要大于或等于,sizeof(double)因为他们必须能够拥有一个double.但是,我得到了输出

1
1
8
Run Code Online (Sandbox Code Playgroud)

clang-3.8和gcc-5.3都产生这个输出.
为什么sizeof返回不正确的尺寸?
如果我使用放置新把一个double进入storageunion_storage将是未定义的行为吗?

c++ sizeof type-traits c++11

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

std :: vector :: erase()在擦除时真的使迭代器无效吗?

我正在玩弄着解迭代器失效规则.但是,当我在c ++ 14编译器中运行以下代码时,输​​出真的让我很困惑..

std::vector<int> test = {1,2,3};
auto it = test.begin() + 1;
test.erase(it);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出= 3不应该在此时无效吗?为什么它似乎跳到下一个pos?提前谢谢了

c++ iterator vector c++11

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