小编M. *_* E.的帖子

type_info不是RTTI的一部分吗?

我曾问过一个问题C++ POD类型有RTTI吗?有人在评论中告诉我:

POD类型确实有type_info,但没有RTTI,这是可能的,因为type_info并不总是RTTI.

它似乎是正确的,因为我可以获得type_infoPOD(非多态)类型.

但是当我编译这个简单的程序时:

#include <iostream>

struct X
{
    int a;
};

int main()
{
    using namespace std;

    std::cout << typeid(X) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

-fno-rtti海湾合作委员会的旗帜:

$ g++ -fno-rtti main.cpp && ./main
Run Code Online (Sandbox Code Playgroud)

它不会编译:

main.cpp: In function ‘int main()’:
main.cpp:12:26: error: cannot use typeid with -fno-rtti
     std::cout << typeid(X) << std::endl;
                          ^
Run Code Online (Sandbox Code Playgroud)

这是否意味着type_info是RTTI的一部分,还是仅仅是GCC 的行为

c++ gcc rtti

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

为什么C++没有const通用引用?

Scott Meyers (对于功能模板的参数):

通用引用只能以" T&&" 形式出现!即使简单地添加const限定符也足以禁用" &&"作为通用引用的解释.

为什么C++没有const通用引用?有技术原因吗?

c++ c++11 universal-reference

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

编译器如何知道必须调用std :: forward函数的哪个重载?

以下签名声明为std::forward重载:

template<class T> T&& forward(typename remove_reference<T>::type& arg) noexcept;
template<class T> T&& forward(typename remove_reference<T>::type&& arg) noexcept;
Run Code Online (Sandbox Code Playgroud)

现在,考虑以下模板函数:

template<class T> T&& foo_as_always(T&& t)
{
    return std::forward<T>(t);
}
Run Code Online (Sandbox Code Playgroud)

如果我写:

int i = 0;
foo_as_always(i);
Run Code Online (Sandbox Code Playgroud)

然后这就是编译器实例化的foo_as_always方式T = int&:

int& foo_as_always(int& t)
{
    // Does it call the first signature of std::forward(int&)
    return std::forward<int&>(t);
}
Run Code Online (Sandbox Code Playgroud)

如果我写:

foo_as_always(0);
Run Code Online (Sandbox Code Playgroud)

那么编译器实例foo_as_alwaysT = int:

int&& foo_as_always(int&& t)
{
    // Does it call the second signature of std::forward(int&&)?
    return std::forward<int>(t); …
Run Code Online (Sandbox Code Playgroud)

c++ templates perfect-forwarding c++11

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

C++程序真的比类似的C程序慢吗?

假设我用C++编写了一个程序而没有使用RTTI和运行时多态(没有虚函数,没有虚继承),并且类没有私有/受保护成员,也没有使用C++特定的头文件(即C头)文件被使用:cstring,cstdio,...代替string,iostream......).

然后我想在C中编写一个类似的程序,其中函数的第一个参数类型对应于相关的struct.

例如:

//C++ code

struct Custom
{
    int a;
    Custom() { }
    void change() { }
    ~Custom() { }
};

int main()
{
    Custom m; //init m
    m.change();
    //destroy m
}

/*C code*/

struct Custom
{
    int a;
};
void custom_init(Custom* like_this) { }
void custom_change(Custom* like_this) { }
void custom_destroy(Custom* like_this) { }

int main()
{
    Custom m;
    custom_init(&m);
    custom_change(&m);
    custom_destroy(&m);
}
Run Code Online (Sandbox Code Playgroud)

C++程序是否比类似的C程序慢(一般)?如果是的话,为什么C程序会更快?我知道,C++使用RAII设计模式进行内存管理,这是缓慢的原因吗?

我听说有些人说C程序更快......为什么?

编辑:为什么这个问题被关闭?我想知道c ++是否还做了我们不需要的东西,以及它如何影响性能(使它更慢?更快?或什么都没有?).

c c++ comparison performance

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

如何处理c ++中的按键事件

我正在编写自定义控制台程序.我想让它看起来像一个真实的.所以我想用keypress事件绑定一些动作.

例如,当按下向上箭头时,应向用户显示先前执行的命令.我知道SDL.但我认为它不是标准库,是吗?

如果还有其他选择,包括在标准CPP库中,请告诉我.

谢谢.

c++ keypress console-application standard-library

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

C++ POD类型有RTTI吗?

据我所知,RTTI是如何在各种C++编译器(如GCC)中实现的,指向type_info数据的指针存储在vtable每个类的数据中.

而且如这里提到的,POD类型可能没有vtable.

但是如果POD类型可能没有,vtable那么指向type_info存储的指针在哪里?我知道它是特定于实现的,但最好是要了解C++编译器(如GCC)内部.

c++ rtti vtable

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

替换为C++中删除的bind1st 17

我有这个用法,bind1st但我将我的项目升级到C++ 17,因为bind1st已删除.

如何bind1st在以下声明中替换?LAMBDA?

DBManager::Instance().FuncQuery(std::bind1st(std::mem_fn(&CGuild::LoadGuildData), this), "SELECT master, level, exp, name, skill_point, skill, sp, ladder_point, win, draw, loss, gold FROM guild WHERE id = %u", m_data.guild_id);
Run Code Online (Sandbox Code Playgroud)

c++ c++17

5
推荐指数
2
解决办法
970
查看次数

模板参数的引用变量引起的问题

以下小例子显示了我的问题:

template<class T> struct X
{
    static void xxx(T& x) { }
    static void xxx(T&& x) { }
};

int main(int argc, char** argv)
{
    int x = 9;
    X<int>::xxx(x); // OK.
    X<int&>::xxx(x); // ERROR!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误消息(GCC):

错误:'static void X :: xxx(T &&)[with T = int&]'无法重载
错误:'static void X :: xxx(T&)[with T = int&]'

为什么?T = int&--->是T&替换int&&static void xxx(T& x)

如果问题的答案是肯定的,那么:

  • T& 不是左值引用,它变成了右值引用!
  • 以下代码应该工作:

但它没有:

template<class T> struct X
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates lvalue rvalue-reference c++11

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

为C++建立标准GUI库的缺点是什么?

对于C++中的GUI编程,我们可以选择太多的库,例如Qt,Gtkmm,wxWidgets,FLTK,还有另一个已经存在的库:Nana.

Nana C++库使用现代C++(C++ 11)语言功能,如lambdas,模板等,它似乎与C++标准库兼容.

如果GUI库与C++标准库100%兼容,那么为什么我们不能将它用于下一个C++标准(C++ 14或C++ 17)?

库在C++标准库中需要哪些条件?如果条件没有定义,那么我们永远注定要陷入文本的黑洞,它会伤害你的心!否则,如果定义了条件,那么我在哪里可以请求库在下一个C++标准中?

c++ user-interface standard-library nana

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