干杯和hth.- Alf在这个答案中发表评论说,与C++ 98相比,值初始化可以说是C++ 03的一个新特性.我想知道他的意思.
是值初始化的C++ 98的一部分?它是出现在概念中而不是名义上吗?为什么它被添加到C++ 03标准中?
我有'03标准的副本,但不是'98标准.这是默认初始化和值初始化的定义.
默认初始化T类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
对值类型T的对象进行值初始化意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化
我的猜测是'98有默认初始化但不是值初始化,并且两者之间存在一些关键差异.说实话,我在解析这里的标准时遇到了麻烦,我不明白这些定义之间的区别.
让我说我有
#include <string>
#include <vector>
using namespace std;
struct Student
{
const string name;
int grade;
Student(const string &name) : name(name) { }
};
Run Code Online (Sandbox Code Playgroud)
那么,我如何保留学生的矢量?
int main()
{
vector<Student> v;
// error C2582: 'operator =' function is unavailable in 'Student'
v.push_back(Student("john"));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者我必须在堆上分配所有学生,并存储指向他们每个人的指针?
如果我有用C++ 03编写的库并将其编译为静态库,那么我可以在C++ 11中使用它吗?也是相反的可能(使用C++ 03的C++ 11静态库).
更新: 我使用的编译器是clang或LLVM
应该set_terminate/ get_terminate为C++ 2011或C++ 2003中的多个线程设置不同的终止异常处理器?
例如,如果我有程序并设置终止处理程序func_1; 然后我开始3个线程.什么是新线程中的终止处理程序?如果在每个线程中我将设置终止处理程序到func_2第一个线程,func_3第二个线程等等.
N3242(C++ 2011草案)[handler.functions]在[support.exception]/ 或中没有说明[exception.terminate]
PS:对于这些标准的任何流行实现,您可以回答C++ 2011或C++ 2003
PPS:有FCD评论... C++ FCD评论状态版本5 N3249(2011):
GB 71 18.6.2.4 / 18.8.2.2 / 18.8.3.2
Run Code Online (Sandbox Code Playgroud)
的线程安全
std::set_new_handler(),std::set_unexpected(),std::set_terminate(),是不确定使得功能不可能一个线程安全的方式使用.必须指定函数的线程安全保证,并且应提供新接口,以便以线程安全的方式查询和安装处理程序.
LWG 1365 接受修改
见文件 N3189
我正在尝试编写一个可以在可变大小的std :: array上工作的函数,例如:
std::array a<int,5>={1,2,3,4,5};
std::array b<int,3>={6,7,8};
myFunc(a);
myFunc(b);
void myFunc(std::array &p)
{
cout << "array contains " << p.size() << "elements";
}
Run Code Online (Sandbox Code Playgroud)
但是,除非我指定大小,否则它不起作用,但我希望函数从数组中获取大小.我真的不想要矢量使用的复制和动态分配,我想使用std :: array()分配的空间,并且不希望编译器为每个可能的数组大小创建函数的副本.
我想过创建一个像数组一样工作的模板,但是它会指向现有数据,而不是自己分配,但不想重新发明轮子.
这有可能吗?
我有自己的智能指针实现,现在我试图解决通过其指针调用成员函数的问题.我没有提供任何类似get()的函数(实际上,我提供了一个operator->,但我不想将它用于此目的).
我的问题是:签名和返回类型应该是什么operator->*样的?
使用此代码:
struct A
{
int i;
const int b;
};
// The union is to verify that A is a type that can be used in a union.
union U
{
A a;
int b;
};
int main()
{
U a = {1, 1};
U b = {2, 1};
}
Run Code Online (Sandbox Code Playgroud)
g ++版本4.8.3抱怨错误:
a.cpp:9:4: error: member ‘A U::a’ with copy assignment operator not allowed in union
A a;
^
a.cpp:9:4: note: unrestricted unions only available with -std=c++11 or -std=gnu++11
Run Code Online (Sandbox Code Playgroud)
但是clang 3.5.0编译这段代码没有错误.哪一个是正确的?这是编译器错误吗? …
可以在if语句的条件内定义和复制初始化变量:
if(int i = 17) { ... }
Run Code Online (Sandbox Code Playgroud)
这也适用于用户定义的类型,因为它们会重载operator bool:
if(Foo f = 42) { ... }
if(Foo f = Foo(43)) { ... }
Run Code Online (Sandbox Code Playgroud)
为什么我不能使用直接初始化,如下所示?
if(Foo f(51)) { ... }
Run Code Online (Sandbox Code Playgroud)
GCC发布error: expected primary-expression before 'f'.
除了"因为语法这么说"之外还有其他原因吗?我该如何解决它?
我正在使用VC++ 03,其中Foo:
...所以我宁愿避免复制或重复它的类型.
注意:虽然我的实际问题是C++ 03,但我(学术上)对C++ 11中的答案很感兴趣.
请注意C++ 03是我真正需要的,但出于知识的考虑,我想在C++ 11中看到一些更漂亮的实现.
我需要一个模板类
template <typename T>
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
Run Code Online (Sandbox Code Playgroud)
我需要:
然后我需要A看起来像这样(完全像上面)
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
Run Code Online (Sandbox Code Playgroud)
int&):然后我需要A看起来像这样:
class A{
private:
T& m_member;
public:
A(T& _member);
//... MORE STUFF
void foo(T param); // still the same T, not T&
};
Run Code Online (Sandbox Code Playgroud)
如果我知道A只接收了整数,那么我将能够使用专业化.但是A的用户可以使用任何类型:
main.cpp中
A<int> a1;//1st version
A<int&> a2;//2nd version
A<B> a3;//1st version
A<B&> …Run Code Online (Sandbox Code Playgroud) 我的团队正在开发一个嵌入式系统,我们需要遵循MISRA C++.
我们正在重构代码以使用更少的虚方法,因此我们尝试实现CRTP以使用静态多态而不是动态多态.
但是我们遇到静态多态性需要指针转换的问题,因此我们的静态分析检查器会抱怨.
这是界面
template <typename T>
class UpdateMethod
{
protected:
~UpdateMethod() {}
public:
void operator()() const
{
// [MISRA Rule 5-2-7] violation:
static_cast<const T*>(this)->update();
}
};
Run Code Online (Sandbox Code Playgroud)
以下是其中一个实现:
class A
: public UpdateMethod<A>
{
public:
void update() const {}
};
Run Code Online (Sandbox Code Playgroud)
在通过MISRA检查程序时,它会抱怨static_cast(从ptr转换为ptr(e926).
所以,我的问题是:有没有什么好的方法来实现CRTP而不必压制MISRA警告,所以以安全的方式?
仅有关于指针转换的相关问题: MISRA C++ 2008规则5-2-7违规:指针类型的对象不应直接或间接转换为无关指针类型 我在CRTP中具有相同的错误.
编辑:正如前面提到的只有C++ 03而没有像boost这样的外部库.