标签: c++03

GCC编译器对C/C++标准保持多少?

例如,具有C99标准的C编程语言支持十六进制浮点文字,但C++与C++ 03标准不支持.

我对它进行了测试,GCC在C++ 03模式下识别了十六进制浮动文字(-std = c ++ 03),但根据C++标准,它不应该.我知道,这不是一个悲剧,我只是对这个问题感兴趣..

GCC编制器是否符合标准?你能推荐我一个符合标准"完美"的C/C++编译器吗?

gcc c99 c++03

2
推荐指数
1
解决办法
114
查看次数

C++模板自动类型提升

template <class T>
class Foo {
public:
    T val;
    Foo(T _v): val(_v){}
    friend ostream& operator<< (ostream& out, const Foo& A) {
        out << A.val;
        return out;
    }
};

template <class X, class Y> Foo<???> operator+(const Foo<X>& A, const Foo<Y> & B) {
    if (sizeof(X) > sizeof (Y))
        return Foo<X>(A.val + B.val);
    else
        return Foo<Y>(A.val + B.val);
}

int main() {
    Foo<double> a(1.5);
    Foo<int> b(2);
    cout << a << endl;
    cout << b << endl;
    cout << a+b << endl;
} …
Run Code Online (Sandbox Code Playgroud)

c++ c++03

2
推荐指数
1
解决办法
1001
查看次数

什么时候std :: map调用映射类型的构造函数?

如果我有这样的容器....

std::map <std::string, IHaveAReallyExpensiveConstructor_t>
Run Code Online (Sandbox Code Playgroud)

我保证IHaveAReallyExpensiveConstructor_t()只有在地图中创建一个新元素时才会调用构造函数,比如说std::map::operator[]

如果重要,只有默认构造很难.复制结构很便宜,而不是真正的问题.

c++ c++03

2
推荐指数
1
解决办法
441
查看次数

字符串化块中的空字符文字

为了简化在C++中编写SQL查询,我使用宏

#define SQL(...) #__VA_ARGS__
Run Code Online (Sandbox Code Playgroud)

它工作正常,除非出现空字符串文字(类似于

SQL(select * from foo where bar = '')
Run Code Online (Sandbox Code Playgroud)

),clang(没有其他编译器)发出警告

warning: empty character constant [-Winvalid-pp-token]
Run Code Online (Sandbox Code Playgroud)

我正在做一个严重的黑客(我仍然保持,因为它允许多行sql语句可读)违反标准或在这里过于关键(字符文字没有出现在预处理器指令中)?

编辑:忘记提及并非所有平台都支持C++ 11,因此我们不能使用原始字符串文字.我们可能会坚持使用VisualC++ 9.0多年,而Gcc 4.6-somesnapshot可能更少,但仍然是几年.黑客攻击也早于C++ 11.

c++ clang language-lawyer c-preprocessor c++03

2
推荐指数
1
解决办法
436
查看次数

C++ std:.auto_ptr或std :: unique_ptr(支持多个编译器,甚至是旧的C++ 03编译器)?

我正在尝试更新一些C++代码,我想转向更现代的代码(c ++ 11),但我仍然需要使用一些较旧的编译器(符合c ++ 03)编译代码,因为支持的平台约束.

我知道在C++ 11编译器中不推荐使用std :: auto_ptr,但由于编译器支持较旧,我不能只用std :: unique_ptr替换它们.

有没有一个很好的做法来处理这个"旧的编译器支持,但是开始转向C++ 11"?

c++ smart-pointers c++11 c++03

2
推荐指数
1
解决办法
796
查看次数

为什么将 swap() 实现为非抛出

我确实理解为什么有时建议为swap()给定的类实现我们自己的函数。

例如,如果我们有一个遵循pimpl习惯用法的类,我们可能希望定义自己的复制构造函数,以便它执行作为参数传递的对象内容的深层复制,而不是由默认的复制构造函数。这同样适用于复制赋值运算符

因为它似乎是通过复制构造函数复制赋值std::swap()运算符(至少在 C++03 中)实现的。对要交换的对象执行深拷贝是低效的,因为只需要交换这些对象所包含的指针。

我的问题是为什么我们应该将我们的swap()函数实现为非抛出函数。

在上面解释的情况下,我认为这只是关于语义:因为没有分配新资源(即:只是交换两个现有指针)。对于这样一种函数来说,抛出异常没有多大意义。

然而,在这个推理中我可能忽略了其他原因或场景。

c++ c++03

2
推荐指数
1
解决办法
717
查看次数

将 std::vector&lt;int&gt; 保存到文件

我注意到,使用时:

std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();
Run Code Online (Sandbox Code Playgroud)

mystd::vector<int>未序列化为原始字节数据(每个 4 个字节)int),而是序列化为字符串,即每个整数的字符串表示形式保存到磁盘,这是我不想要的。

如何保存std::vector<int>为二进制数据?

(注意:在学习新方法之前,我想用标准 C++03 来学习它)。

c++ serialization vector c++03

2
推荐指数
1
解决办法
1937
查看次数

有没有一种优雅的方法可以从 std::vector 实例化 boost::array?

编写一个接口,我必须将 的实例转换std::vector<double>boost::array<double,N>. 每次,通过构造(没有错误),我确定向量具有正确的大小。

这是我目前正在做的一个例子(我有大约 100 个这样的函数要写在界面中):

double foo1(const std::vector<double>& x)
{
  assert(x.size() == 4);
  boost::array<double,4> x_;
  for(std::size_t i = 0; i < 4; ++i)
    x_[i] = x[i];
  return foo1_(x_);
}

double foo2(const std::vector<double>& x)
{
  assert(x.size() == 6);
  boost::array<double,6> x_;
  for(std::size_t i = 0; i < 6; ++i)
    x_[i] = x[i];
  return foo2_(x_);
}
Run Code Online (Sandbox Code Playgroud)

有没有更短的方法来做到这一点?

注 1:出于兼容性原因,我不使用 C++11。

注 2:我添加了标签,stdarray因为即使它是 C++11 标签,它也可能有所帮助。

c++ boost stdvector c++03 stdarray

2
推荐指数
1
解决办法
1764
查看次数

如何调用绑定所有参数的 boost::function 对象

我一直在阅读and boost::function,但是,如果所有参数都被绑定,boost::bind我似乎无法找出调用函数的“好方法” (我认为这是正确的术语)。boost下面是未经测试的 MCVE(复制粘贴我的真实代码并不理想)。

#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <iostream>

void func(void* args)
{
  int* myInt = static_cast<int*>(args);
  if (myInt != NULL)
  {
    std::cout << "myInt = " << *myInt << std::endl;
  }
  else
  {
    std::cout << "args is NULL" << std::endl;
  }
}

int main()
{
  int myInt1 = 5;
  int myInt2 = 45;

  boost::function<void(void* args)> myFunc = boost::bind(&func, &myInt1);

  // here's my problem,, how do I call myFunc?
  myFunc();  // this …
Run Code Online (Sandbox Code Playgroud)

c++ boost c++03

2
推荐指数
1
解决办法
917
查看次数

如何设置我的类,使其无法从 C++98/C++03 继承?

B使用 C++98(或 C++03),如何定义类 ( ),使得不能从D派生自 的类 ( )实例化任何对象B

struct B {};
struct D : public B {};
D d; // this should result in a compiler error
Run Code Online (Sandbox Code Playgroud)

在 C++11(或更新版本)中,可以使用final说明符。

c++ c++03 c++98

2
推荐指数
1
解决办法
80
查看次数