如何将std::stringa 转换为a char*或a const char*?
假设我有一个函数,它需要std::function:
void callFunction(std::function<void()> x)
{
x();
}
Run Code Online (Sandbox Code Playgroud)
我应该x通过const-reference来代替吗?:
void callFunction(const std::function<void()>& x)
{
x();
}
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是否会根据函数的作用而改变?例如,如果它是一个类成员函数或构造函数,它存储或初始化std::function成成员变量.
根据cppreference.com size_t定义的几个标题,即
<cstddef>
<cstdio>
<cstring>
<ctime>
Run Code Online (Sandbox Code Playgroud)
而且,从C++ 11开始,也在
<cstdlib>
<cwchar>
Run Code Online (Sandbox Code Playgroud)
首先,我想知道为什么会这样.这与DRY原则是否相矛盾?但是,我的问题是:
我应该使用上面哪个标题来使用size_t?它有关系吗?
该cplusplus.com shared_ptr页面召唤出一个区分空 std::shared_ptr和空 shared_ptr.该cppreference.com页面没有明确叫出区别,但同时使用"空",并比较nullptr其描述std::shared_ptr行为.
空和空之间有区别shared_ptr吗?这种混合行为指针有用例吗?非空null是否shared_ptr有意义?是否会出现正常使用情况(即如果你没有明确构造一个),你最终会得到一个空但非空的shared_ptr?
如果您使用的是Boost版本而不是C++ 11版本,那么这些答案中的任何一个都会改变吗?
如何在STL中实现交换功能?它是这么简单:
template<typename T> void swap(T& t1, T& t2) {
T tmp(t1);
t1=t2;
t2=tmp;
}
Run Code Online (Sandbox Code Playgroud)
在其他帖子中,他们谈论为您自己的班级专门化这个功能.我为什么要这样做?为什么我不能使用这个std::swap功能?
我正在尝试在Visual Studio Code中构建C/C++.我安装了C/C++和所有相关的扩展.
#include <stdio.h>
int main() {
printf("Test C now\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是在#include <stdio.h>"添加包含设置路径" 下面有一条绿线.当我单击它时,它会移动到"c_cpp_properties.json".
我可以在下面的配置中添加包含路径的方式和位置?
"configurations": [
{
"name": "Mac",
"includePath": ["/usr/include"]
}
]
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C++,发现下面的代码非常奇怪.
class Foo{
public:
virtual void say_virtual_hi(){
std::cout << "Virtual Hi";
}
void say_hi()
{
std::cout << "Hi";
}
};
int main(int argc, char** argv)
{
Foo* foo = 0;
foo->say_hi(); // works well
foo->say_virtual_hi(); // will crash the app
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道虚方法调用崩溃,因为它需要vtable查找,并且只能使用有效对象.
我有以下问题
say_hiNULL指针?foo分配?有什么想法吗?
在C++中,如果我们将类析构函数定义为:
~Foo(){
return;
}
Run Code Online (Sandbox Code Playgroud)
在调用这个析构函数时,将Foo被销毁的对象或者从析构函数显式返回的对象意味着我们不想破坏它.
我想这样做只有通过另一个对象析构函数才能销毁某个对象,即只有当另一个对象准备被销毁时才会销毁.
例:
class Class1{
...
Class2* myClass2;
...
};
Class1::~Class1(){
myClass2->status = FINISHED;
delete myClass2;
}
Class2::~Class2(){
if (status != FINISHED) return;
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索,似乎无法找到我的问题的答案.我也尝试通过使用调试器逐步完成一些代码来自己搞清楚,但无法得到确定的结果.
class A {
public:
virtual void f() = 0;
};
class B : public A {
public:
void f() final override { };
};
int main() {
B* b = new B();
b->f();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器是否仍需要执行v表查找b->f();,或者是否可以B::f()直接调用,因为它已被标记final?
C++ 11(和C++ 14)引入了针对通用编程的其他语言结构和改进.这些功能包括:
我在浏览较早草案的的C++ 14规范(现在更新文本)和码中的示例中§20.5.1,编译时整数序列,我发现有趣和奇特.
template<class F, class Tuple, std::size_t... I>
decltype(auto) apply_impl(F&& f, Tuple&& t, index_sequence<I...>) {
return std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))...);
}
template<class F, class Tuple>
decltype(auto) apply(F&& f, Tuple&& t) {
using Indices = make_index_sequence<std::tuple_size<Tuple>::value>;
return apply_impl(std::forward<F>(f), std::forward<Tuple>(t), Indices());
}
Run Code Online (Sandbox Code Playgroud)
在线这里[intseq.general]/2.
题
f在apply_impl被转发,即为什么std::forward<F>(f)(std::get...?f(std::get...?