小编Joh*_*ing的帖子

虚函数可以有默认参数吗?

如果我声明了一个基类(或接口类)并为其一个或多个参数指定了一个默认值,那么派生类是否必须指定相同的默认值,如果没有,哪些默认值将在派生类中显示?

附录:我也对如何在不同的编译器中处理这个问题以及在这种情况下对"推荐"实践的任何输入感兴趣.

c++ c++11 c++03

152
推荐指数
6
解决办法
6万
查看次数

Lambda捕获为const引用?

是否可以通过lambda表达式中的const引用进行捕获?

我希望下面标记的作业失败,例如:

#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string strings[] = 
    {
        "hello",
        "world"
    };
    static const size_t num_strings = sizeof(strings)/sizeof(strings[0]);

    string best_string = "foo";

    for_each( &strings[0], &strings[num_strings], [&best_string](const string& s)
      {
        best_string = s; // this should fail
      }
    );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更新:由于这是一个老问题,如果C++ 14中有设施来帮助解决这个问题,那么更新它可能会更好.C++ 14中的扩展是否允许我们通过const引用捕获非const对象?(2015年8月)

c++ lambda c++11 c++14

151
推荐指数
6
解决办法
5万
查看次数

未定义的引用`WinMain @ 16'

当我尝试使用构建程序时Eclipse CDT,我得到以下内容:

/mingw/lib/libmingw32.a(main.o):main.c:(.text+0x106):未定义引用`WinMain @ 16

这是为什么?而且,我该如何解决这个问题呢?

c++ eclipse eclipse-cdt

103
推荐指数
4
解决办法
22万
查看次数

如何在我的dll界面或ABI中使用标准库(STL)类?

在导出包含与visual studio警告C4251相关的stl类的类之前,有一些问题:例如这个问题或这个问题.我已经阅读过UnknownRoad的优秀解释.

盲目地禁用警告似乎有点危险,尽管它可能是一种选择.包装所有这些std类并导出它们也不是一个真正的选择.它毕竟被称为标准模板库...即,想要提供这些标准类的接口.

如何在我的dll界面中使用stl-classes?什么是常见做法?

c++ dll stl std c++11

62
推荐指数
1
解决办法
1万
查看次数

Unicode的异常what()

或者,"俄罗斯人如何抛出异常?"

std :: exception的定义是:

namespace std {
  class exception {
  public:
    exception() throw();
    exception(const exception&) throw();
    exception& operator=(const exception&) throw();
    virtual ~exception() throw();
    virtual const char* what() const throw();
  };
}
Run Code Online (Sandbox Code Playgroud)

一个思想的流行学设计异常层次结构是从的std ::例外得出:

通常,最好抛出对象,而不是内置函数.如果可能,您应该抛出从(最终)从std :: exception类派生的类的实例.通过使您的异常类从标准异常基类继承(最终),您可以让您的用户更轻松(他们可以选择通过std :: exception捕获大部分内容),而且您可能正在为他们提供更多信息(例如,您的特定异常可能是std :: runtime_error或其他任何内容的改进).std :: runtime_error或其他).

但是面对Unicode,似乎不可能设计一个能够实现以下两个目的的异常层次结构:

  • 最终从std :: exception派生,以便在catch站点使用
  • 提供Unicode兼容性,以便诊断不会被切片或乱码

使用可以使用Unicode字符串构造的异常类非常简单.但标准规定what()必须返回一个const char*,因此在某些时候输入字符串必须转换为ASCII.无论是在构造时完成还是调用what()(如果源字符串使用的字符不能用7位ASCII表示),可能无法在不丢失保真度的情况下格式化消息.

如何设计一个异常层次结构,它结合了std :: exception派生类与无损Unicode诊断的无缝集成?

c++ c++11

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

`long`保证至少为32位?

通过阅读C++标准,我一直都知道C++中的整数基本类型的大小如下:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)

我从3.9.1/2中推断出这个:

  1. 有四种带符号的整数类型:"signed char","short int","int"和"long int".在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间.简单的int具有执行环境的体系结构所建议的自然大小

此外,大小char由3.9.1 /描述为:

  1. [...]大到足以存储实现的基本字符集的任何成员.

1.7/1以更具体的术语定义:

  1. C++内存模型中的基本存储单元是字节.一个字节至少足以包含基本执行字符集的任何成员,并且由连续的位序列组成,其数量是实现定义的.

这导致我得出以下结论:

1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)

where sizeof告诉我们这个类型的字节数.此外,它是实现定义的字节中有多少位.我们大多数人可能习惯于处理8位字节,但标准表示n字节中有位.


这篇文章中,Alf P. Steinbach说:

long保证(至少)32位.

根据标准,这一切都在我理解C++基本类型的大小面前.通常情况下,我只是将这句话视为初学者错误,但由于这是Alf,我认为值得进一步调查.

那么,你呢?标准长期保证至少为32位?如果是这样,请具体说明如何进行此保证.我只是没有看到它.

  1. C++标准特别指出,为了了解C++,你必须知道C(1.2/1)1

  2. C++标准隐含地定义了long可容纳的值的最小限制LONG_MIN- LONG_MAX 2

所以无论多大long,它都必须足够大才能将LONG_MIN保持为LONG_MAX.

但Alf和其他人特别指出,long必须至少为32位.这就是我想要建立的.C++标准明确指出一个字节中的位数没有指定(可能是4,8,16,42)那么连接如何能够容纳数字LONG_MIN-LONG_MAX至少为32位?


(1)1.2/1:以下参考文件对于本文件的应用是必不可少的.凡是注日期的引用文件,仅引用的版本适用.凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本标准.

  • ISO/IEC 2382(所有部分),信息技术 - 词汇
  • ISO/IEC 9899:1999,编程语言 - C.
  • ISO/IEC 10646-1:2000,信息技术 - 通用多八位字节编码字符集(UCS) - 第1部分:体系结构和基本多语言平面

(2)定义 …

c++ standards language-lawyer long-integer

50
推荐指数
5
解决办法
1万
查看次数

static const成员价值与成员枚举:哪种方法更好?为什么?

如果要将某个常量值与类关联,可以使用以下两种方法来实现相同的目标:

class Foo
{
public:
    static const size_t Life = 42;
};

class Bar
{
public:
    enum {Life = 42};
};
Run Code Online (Sandbox Code Playgroud)

在语法和语义上,从客户的角度来看,它们似乎是相同的:

size_t fooLife = Foo::Life;
size_t barLife = Bar::Life;
Run Code Online (Sandbox Code Playgroud)

除了纯粹的风格之外,还有什么理由可以解释为什么一个人比另一个人更可取?

c++ class-design

43
推荐指数
6
解决办法
2万
查看次数

42
推荐指数
3
解决办法
6万
查看次数

为什么我们不能声明void类型的变量?

我正在寻找标准中对这一事实的正式解释.我已经找到了3.9.1/9所说的内容并尝试用该部分作出解释.

第3.9.1/9节,N3797:

void类型具有一组空值.void类型是不完整的类型,无法完成.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cv void(5.4)类型.void类型的表达式只能用作表达式语句(6.2),作为逗号表达式(5.18)的操作数,作为?:( 5.16)的第二个或第三个操作数,作为typeid,noexcept或者操作数的操作数. decltype,作为返回类型为void的函数的返回语句(6.6.3)中的表达式,或者作为显式转换为类型cv void的操作数.

我不明白它是如何暗示void类型有一组空的值?

假设类型T具有一组空值.为什么编译器在遇到以下行时会抛出错误:

extern T v; 
Run Code Online (Sandbox Code Playgroud)

我们可以通过以下方式对不完整类型的变量进行decalre:

#include <iostream>
#include <cstring>

using namespace std;

struct Foo;

extern Foo f; //OK!

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

它工作正常

DEMO

它不能在void类型上完成

#include <iostream>
#include <cstring>

using namespace std;

extern void f; //compile-time error

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

DEMO

c++ void language-lawyer

38
推荐指数
2
解决办法
2万
查看次数

"&s [0]"是否指向std :: string中的连续字符?

我正在做一些维护工作,遇到类似以下的事情:

std::string s;
s.resize( strLength );  
// strLength is a size_t with the length of a C string in it. 

memcpy( &s[0], str, strLength );
Run Code Online (Sandbox Code Playgroud)

我知道使用&s [0]如果它是std :: vector会是安全的,但是这是std :: string的安全使用吗?

c++ stdstring memcpy c++03

37
推荐指数
3
解决办法
1万
查看次数