标签: c++03

值初始化是C++ 98标准的一部分吗?如果没有,为什么它被添加到C++ 03标准中?

干杯和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有默认初始化但不是值初始化,并且两者之间存在一些关键差异.说实话,我在解析这里的标准时遇到了麻烦,我不明白这些定义之间的区别.

c++ language-lawyer value-initialization c++03 c++98

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

const成员的结构矢量?

让我说我有

#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++ const c++03

11
推荐指数
3
解决办法
2197
查看次数

带有C++ 11源代码的C++ 03库

如果我有用C++ 03编写的库并将其编译为静态库,那么我可以在C++ 11中使用它吗?也是相反的可能(使用C++ 03的C++ 11静态库).

更新: 我使用的编译器是clang或LLVM

c++ clang c++11 c++03

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

C++,set_terminate是每个线程的本地吗?

应该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

c++ exception-handling language-lawyer c++11 c++03

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

传递std:数组

我正在尝试编写一个可以在可变大小的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()分配的空间,并且不希望编译器为每个可能的数组大小创建函数的副本.

我想过创建一个像数组一样工作的模板,但是它会指向现有数据,而不是自己分配,但不想重新发明轮子.

这有可能吗?

c++ arrays c++03

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

在C++中重载operator - >*

我有自己的智能指针实现,现在我试图解决通过其指针调用成员函数的问题.我没有提供任何类似get()的函数(实际上,我提供了一个operator->,但我不想将它用于此目的).

我的问题是:签名和返回类型应该是什么operator->*样的?

c++ operator-overloading c++03

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

包含常量成员的POD结构

使用此代码:

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编译这段代码没有错误.哪一个是正确的?这是编译器错误吗? …

c++ const language-lawyer c++03

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

直接初始化条件内的对象

可以在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'.

住在Coliru

除了"因为语法这么说"之外还有其他原因吗?我该如何解决它?

我正在使用VC++ 03,其中Foo:

  • 是一个RAII敏感的对象,我注意不要定义一个复制构造函数
  • 是一个从用户那里获取参数的模板
  • 有一个双参数构造函数

...所以我宁愿避免复制或重复它的类型.

注意:虽然我的实际问题是C++ 03,但我(学术上)对C++ 11中的答案很感兴趣.

c++ if-statement initialization c++03

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

如何为所有引用类型C++ 03专门化类

请注意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)

我需要:

1)如果使用值类型编译A(包括指针,它们本身按值传递):

然后我需要A看起来像这样(完全像上面)

class A {
private:
    T m_member;

public:
    A(T _member);    
    //... MORE STUFF
    void foo(T param);
};
Run Code Online (Sandbox Code Playgroud)

2)如果使用引用类型编译A(例如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)

c++ template-specialization c++03

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

如何在MISRA C++之后实现CRTP

我的团队正在开发一个嵌入式系统,我们需要遵循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这样的外部库.

c++ misra crtp static-cast c++03

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