我曾问过一个问题C++ POD类型有RTTI吗?有人在评论中告诉我:
POD类型确实有type_info,但没有RTTI,这是可能的,因为type_info并不总是RTTI.
它似乎是正确的,因为我可以获得type_info
POD(非多态)类型.
但是当我编译这个简单的程序时:
#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 的行为?
Scott Meyers 说(对于功能模板的参数):
通用引用只能以"
T&&
" 形式出现!即使简单地添加const
限定符也足以禁用"&&
"作为通用引用的解释.
为什么C++没有const
通用引用?有技术原因吗?
以下签名声明为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_always
有T = 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++编写了一个程序而没有使用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 ++是否还做了我们不需要的东西,以及它如何影响性能(使它更慢?更快?或什么都没有?).
我正在编写自定义控制台程序.我想让它看起来像一个真实的.所以我想用keypress事件绑定一些动作.
例如,当按下向上箭头时,应向用户显示先前执行的命令.我知道SDL.但我认为它不是标准库,是吗?
如果还有其他选择,包括在标准CPP库中,请告诉我.
谢谢.
据我所知,RTTI是如何在各种C++编译器(如GCC)中实现的,指向type_info
数据的指针存储在vtable
每个类的数据中.
而且如这里提到的,POD类型可能没有vtable
.
但是如果POD类型可能没有,vtable
那么指向type_info
存储的指针在哪里?我知道它是特定于实现的,但最好是要了解C++编译器(如GCC)内部.
我有这个用法,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) 以下小例子显示了我的问题:
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++中的GUI编程,我们可以选择太多的库,例如Qt,Gtkmm,wxWidgets,FLTK,还有另一个已经存在的库:Nana.
Nana C++库使用现代C++(C++ 11)语言功能,如lambdas,模板等,它似乎与C++标准库兼容.
如果GUI库与C++标准库100%兼容,那么为什么我们不能将它用于下一个C++标准(C++ 14或C++ 17)?
库在C++标准库中需要哪些条件?如果条件没有定义,那么我们永远注定要陷入文本的黑洞,它会伤害你的心!否则,如果定义了条件,那么我在哪里可以请求库在下一个C++标准中?