小编Fel*_*ara的帖子

typedef别名的析构函数

#include <iostream>

struct A { ~A(); };
A::~A() {
    std::cout << "Destructor was called!" << std::endl;
}

typedef A AB;
int main() {
    AB x;
    x.AB::~AB(); // Why does this work?
    x.AB::~A();
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出是:

Destructor was called!
Destructor was called!
Destructor was called!
Run Code Online (Sandbox Code Playgroud)

我假设前两行属于用户析构函数调用,而第三行是由于在退出main函数范围时调用析构函数.

根据我的理解,typedef是类型的别名.在这种情况下AB是别名A.

为什么这也适用于析构函数的名称?非常感谢对语言规范的引用.

编辑:这是在macOS High Sierra版本10.13.3上使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的.

c++ destructor typedef language-lawyer

22
推荐指数
2
解决办法
954
查看次数

为什么变量声明作为for循环的条件运行良好?

什么是声明的返回值/类型int i = 5

为什么不编译这段代码:

#include <iostream>

void foo(void) {
    std::cout << "Hello";
}

int main()
{
    int i = 0;
    for(foo(); (int i = 5)==5 ; ++i)std::cout << i; 
}
Run Code Online (Sandbox Code Playgroud)

虽然这样做

#include <iostream>

void foo(void) {
    std::cout << "Hello";
}

int main()
{
    int i = 0;
    for(foo(); int i = 5; ++i)std::cout << i; 
}
Run Code Online (Sandbox Code Playgroud)

c++ for-loop declaration language-lawyer

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

为什么我们需要指定闪存等待周期数?

特别是在使用 STMF4xx/F7xx 等“更快”的设备时,我们需要根据电源电压和系统时钟频率指定闪存等待周期数。

当 CPU 获取指令/或常量时,这是通过 FLITF 完成的。我的假设是否正确,即 FLITF 只要能够提供所请求的数据,就会保留 CPU 请求,从而使其他总线主控器无法同时访问闪存。

如果这是真的,为什么了解闪存等待周期对于任何接口来说都很重要。就像缓存一样,它会预加载指令,如果它知道要等待多长时间,那么它是独立的,不是吗?

stm32 cortex-m

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

设置的静态constexpr

enum class PARAM_TYPE_ {INT_};
enum class PARAM_NAME_ {NAME_};
typedef std::pair<PARAM_NAME_,PARAM_TYPE_> PARAM_;

static constexpr std::unordered_set<PARAM_> params_ {
        PARAM_(PARAM_NAME_::NAME_,PARAM_TYPE_::STRING_)
};
Run Code Online (Sandbox Code Playgroud)

为什么不能把它放在我的类头文件中?

我试了很长时间才弄清楚为什么不可能使用以下组合:

static,constexpr,非文字类型

但是我的整体c ++知识太有限了.

c++ c++11

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

强制字符串文字参数导致 std::string 类模板推导

我想编写一个类模板,它能够容纳不同的类型。但是,我想避免类型char*或的专业化char[]。字符串应始终为std::string. 下面的代码是我到目前为止所拥有的。然而,写作Scalar("hello")产生T = char[6]而不是产生T = std::string。我可以写Scalar<std::string>("hello")Scalar(std::string("hello"))解决这个问题。我的问题是,有没有一种方法可以修改下面的代码,使编写Scalar("hello")工作按预期进行,并且该类仍然只有一个模板参数?

template <typename T>
class Scalar {
public:

explicit Scalar(const T& val);

};
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

在基本析构函数中创建 self 的副本

我想编写一个类家族,它们在被破坏时在某些条件下创建自身的副本。请看下面的代码

#include <string>
#include <iostream>

bool destruct = false;

class Base;
Base* copy;

class Base {
public:

virtual ~Base() {
    if (!destruct) {
        destruct = true;
        copy = nullptr; /* How to modify this line? */
        std::cout << "Copying" << std::endl;
    } else {
        std::cout << "Destructing" << std::endl;
    }
}

};

class Derived : public Base {
public:

Derived(const std::string& name) : name(name) {}

std::string name;

};

int main() {
    { Derived d("hello"); }

    std::cout << dynamic_cast<Derived*>(copy)->name << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance

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

如何快速找到long中设置的单个位的位置

我有一个 long 设置了一个位,我需要知道它是哪个,例如索引。我需要尽快计算出来。天真的想法是除以 2 并检查结果是否为 1。但这最多需要 63 次迭代(最坏的情况)。

我的下一个想法是进行二分查找,例如查看它是 63-32 位还是 31-0 位,然后是 63 - 48、47 - 31、31 - 16、15 - 0 等等,有很多 if-else 语句,但这给了我一堆代码......

此外,我想尽量减少对象的创建和使用的内存。您可能会认为我对 Java 的看法是错误的,应该使用 C/C++。嗯,这是为了学校比赛,我别无选择:)

我想看一些示例代码!

java optimization performance

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

如何定义别名以通过结构访问枚举类成员?

给出以下代码:

class A {
    enum class B {
        Member
    };
    struct C {
    };
};
Run Code Online (Sandbox Code Playgroud)

如何定义允许我以B::Memberas 身份访问的类型别名C::B::Member

c++ enums alias

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