小编tow*_*owi的帖子

C++ 11中的Unicode标识符和源代码?

我在新的C++标准中找到了

2.11 Identifiers                  [lex.name]
identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined character
Run Code Online (Sandbox Code Playgroud)

附加文字

标识符是任意长的字母和数字序列.标识符中的每个通用字符名称应指定一个字符,其ISO 10646中的编码属于E.1中规定的范围之一.[...]

我无法理解这意味着什么.从旧的标准我习惯\u89ab,例如写一个"通用字符名称" .但是在标识符中使用那些......?真?

新标准对Unicode更加开放吗?而且我没有提到新的文字类型 "uHello \u89ab thing"u32,我想我理解了这些.但:

  • Can(可移植)源代码可以是任何unicode编码,如UTF-8,UTF-16或任何(如何定义的)代码页?
  • 我可以\u1234在里面写一个标识符myfu\u1234ntion(出于任何目的)
  • 或者我可以使用unicode在ICU中定义的"字符名称",即

    const auto x = "German Braunb\U{LOWERCASE LETTER A WITH DIARESIS}r."u32;
    
    Run Code Online (Sandbox Code Playgroud)

    甚至在源本身的标识符中?这将是一种享受...... 咳嗽 ......

我认为答案给所有thise问题是没有,但我不能在标准的可靠映射这措辞... :-)

编辑:我找到了"2.2翻译阶段[lex.phases]",第1阶段:

如果需要,物理源文件字符以实现定义的方式映射到基本源字符集[...].接受的物理源文件字符集是实现定义的.[...]任何不在基本源字符集(2.3)中的源文件字符都将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)

通过阅读本文,我现在认为,编译器可以选择接受UTF-8,UTF-16或它希望的任何代码页(通过元信息或用户配置).在阶段1中,它将其转换为ASCII格式("基本源字符集"),然后用其\uNNNN符号替换Unicode字符(或者编译器可以选择继续以其Unicode表示形式工作,但不得不确保它\uNNNN以相同的方式处理另一个.

你怎么看?

unicode syntax c++11

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

我可以在regex_replace中使用$ 1吗?

从阅读FCD regex_replace(28.11.4)我只能猜测该函数还可以使用原始字符串的一部分进行替换?我不能用我的gcc测试它,这是正确的吗?

using namespace std;
regex rx{ R"((\d+)-(\d+))" }; // regex: (\d+)-(\d+)
cout << regex_replace("123-456", rx, "b: $2, a:$1");
// "b: 456, a:123"
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我认为$1$2"()"捕获组(而不是\1\2像其他地方).

更新.所以,我想这是一个由两部分组成的问题

  • 是否支持在替换文本中使用捕获组
  • 使用$n的默认ECMAScript语法是什么?还是\n

c++ regex replace c++11

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

如何配置'less'来显示格式化的markdown文件?

我想有一些格式的less显示*.md降价文件 - 比如我知道less可以,对于联机帮助页等.我正在运行Ubuntu 12.04.

我将用户定义的过滤器放入.lessfilter:

#!/bin/sh
case "$1" in
  *.md)
    fn=/tmp/$1.$$.html
    markdown "$1" | html2txt > $fn  ### LOSES FORMATTING
    cat $fn                         ### TO STDOUT???
    ;;
  *)
  # We don't handle this format
  exit 1
esac
# No further processing by lesspipe necessary
exit 0
Run Code Online (Sandbox Code Playgroud)

所以,主要问题是:

  • 我怎样才能传递一些基本的格式信息less,而不是丢失它html2txt
  • 将新内容打印到stdout是否正确?或者我可以只写入*.html文件磁盘并让它less在自己的题外话处理(看到html扩展并对其进行操作?)

linux shell markdown text-processing gnu

12
推荐指数
3
解决办法
4532
查看次数

具有算术运算的valarray返回类型

当我写一个简单的算术表达式valarray并将结果分配给auto我时,当我尝试访问gcc上的结果时,我得到一个段错误.

#include <iostream>
#include <valarray>
using std::ostream; using std::valarray;
ostream& operator<<(ostream&os, const valarray<double>&vs) {
    os << "[";
    for(auto&v : vs) os << v << " ";
    return os << "]";
}
int main() {
    valarray<double> a{ 1.0, 2.0, 3.0, 4.0 };
    std::cout << "a: " << a << "\n";
    valarray<double> b{ 2.0, 4.0, 6.0, 8.0 };
    std::cout << "b: " << b << "\n";
    valarray<double> c{ 2.0, 1.5, 0.5, 0.25 };
    std::cout << "c: " << …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++ valarray

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

Java Generics,支持"专业化"?与C++模板的概念相似之处?

我知道如何使用C++ - 模板 - 不是专家,请注意.使用Java Generics(和Scala,就此而言),我有我的困难.也许,因为我试图将我的C++知识转换为Java世界.我读到其他地方,"它们没什么相似之处:Java Generics只是语法糖节省演员,C++模板只是一个美化的预处理器":-)

我很确定,两者都是一个简化的视图.因此,为了理解大的和微妙的差异,我尝试从专业化开始:

C++中,我可以设计一个模板(函数类),它作用于支持我所需操作的任何类型T:

template<typename T>
T plus(T a, T b) { return a.add(b); }
Run Code Online (Sandbox Code Playgroud)

现在这可能会将plus()操作添加到任何可以的类型add().[note1] [1]

因此,如果T支持add(T)我的模板woll工作.如果没有,只要我不使用,编译器就不会抱怨plus().在Python中我们称之为"鸭子打字":*如果它像鸭子一样嘎嘎叫,就像鸭子一样,它一只鸭子.*(当然,使用type_traits这有点修改,但只要我们没有概念,这就是C++模板的工作方式,对吧?)

我想,那就是Java中的泛型如何工作,不是吗?通用类型I设备用作"模板"如何操作我试图放在那里的任何东西,对吧?据我所知,我可以(或必须?)对类型参数设置一些约束:如果我想add在我的模板中使用,我必须声明类型参数implement Addable.正确?所以,没有"鸭子打字"(无论好坏).

现在,在C++中,我可以选择专注于没有的类型add():

template<>
T plus<MyX>(MyX a, MyX b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

即使 …

c++ java generics template-specialization

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

C++ 11中的双重锁定模式?

C++ 11的新机器模型允许多处理器系统可靠地工作.重组指示.

正如Meyers和Alexandrescu指出的那样,"简单"的双重检查锁定模式实现在C++ 03中并不安全

Singleton* Singleton::instance() {
  if (pInstance == 0) { // 1st test
    Lock lock;
    if (pInstance == 0) { // 2nd test
      pInstance = new Singleton;
    }
  }
  return pInstance;
}
Run Code Online (Sandbox Code Playgroud)

他们在文章中表明,无论你作为程序员做什么,在C++ 03中,编译器都有太多的自由:允许以一种你无法确定最终只有一个的方式重新排序指令的例子Singleton.

我现在的问题是:

  • 新的C++ 11机器模型的限制/定义现在是否限制了指令序列,上述代码将始终与C++ 11编译器一起使用?
  • 当使用新的库设施(而不是Lock这里的模拟)时,这个Singleton模式的安全C++ 11实现现在怎么样?

singleton multithreading double-checked-locking c++11

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

如何获取promise :: set_exception(x)的参数?

我在几个地方发现了应该如何使用诺言copy_exception,但我在目前的FDIS中找不到它.set_exception()自那些博客以来,有没有其他方法可以使用?

例如这里

void asyncFun(promise<int> intPromise)
{
    int result;
    try {
        // calculate the result
        intPromise.set_value(result);
    } catch (MyException e) {
        intPromise.set_exception(std::copy_exception(e));  // <- copy
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得std::current_exception() 在这里.

catch(...)
{
    p.set_exception(std::current_exception());
}
Run Code Online (Sandbox Code Playgroud)

因此我的问题:

  • 我是否应该总是使用current_exception(),即使我没有抓到" ..."?
  • 或者是否有新的不同名称copy_exception

c++ multithreading exception promise c++11

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

隐式转换为显式bool类型以分类容器?

我正在玩新explicit的铸造操作员.如果你写的东西像

struct Data {
    explicit operator string(); 
};
Run Code Online (Sandbox Code Playgroud)

不可能意外转换Datastring.所述darget数据类型bool是一个例外:在某些情况下,隐式转换是允许即使它被标记explicit- 上下文转换.因此,您可以在if(...)以下示例中使用此数据类型:

struct Ok {
    explicit operator bool(); // allowed in if(...) anyway
};
Run Code Online (Sandbox Code Playgroud)

该段"25.4.(2)分类及相关业务"似乎让本作Compare的仿标箱set为好.但是我对gcc-4.7.0的尝试失败了,我注意到这是我的错误理解还是gcc中的错误?

#include <set>

struct YesNo { // Return value type of Comperator
    int val_;
    explicit YesNo(int y) : val_{y} {}
    /* explicit */ operator bool() { return val_!=0; }
};

static const YesNo yes{1};
static const YesNo …
Run Code Online (Sandbox Code Playgroud)

c++ boolean explicit c++11

10
推荐指数
1
解决办法
2186
查看次数

如何在Automake和libtool使用项目中构建*.so模块?

我和其他人有同样的问题:

  • 我在Automake项目中有一个*.lalibtool生成的文件(例如),module.la
  • 但是我需要把*.so它用于dlopen()(例如module.so).

但是:项目已配置和构建,--disable-shared以确保创建的主二进制文件是一个大的静态链接程序,例如main.x(更容易部署和调试).因此*.so不会创建文件.

该程序main.x是一个巨大的框架式应用程序,它能够通过加载扩展(模块)dlopen()- 尽管它是静态链接的.

当我module.so手工构建时,这很好用.但是这Makefile.am对我来说似乎是不可能的.是的,我可以写lib_LTLIBRARIES,但按照我的标准,--disable-shared我没有得到*.so文件.

lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
Run Code Online (Sandbox Code Playgroud)

module.la创建文件,dlopen()拒绝加载(当然).

我试图将规则用于Makefile.am手动构建它并且有效:

# Makefile.am (yes, .am)
all: mm_cpp_logger.so

SUFFIXES = .so

%.so: %.cpp
    $(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@  $<

%.so: %.o
    $(CXX) …
Run Code Online (Sandbox Code Playgroud)

automake shared-libraries libtool

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

"零规则"是否也适用于具有虚拟方法的类?

我发现Peter Sommerlads Slides(第32页)中提到的零法则非常引人注目.

虽然,我好像记得,有一个严格的规则,一个定义虚拟析构函数,如果类有虚拟成员和实际的.

struct Base {
    virtual void drawYourself();
    virtual ~Base() {}
};
struct Derived : public Base {
    virtual void drawYourself();
};
Run Code Online (Sandbox Code Playgroud)

析构函数的主体甚至可能是空的(它只需要vtbl中的条目).

我似乎记得在使用层次结构时

int main() {
    Base *obj = new Derived{};
    obj->drawYourself(); // virtual call to Derived::drawYourself()
    delete obj; // Derived::~Derived() _must_ be called
}
Run Code Online (Sandbox Code Playgroud)

那么delete obj 调用正确的析构函数是很重要的.这是正确的,如果我完全省略了析构函数定义,它就不会变成虚拟的,因此会调用错误的数字吗?

struct Base {
    virtual void drawYourself();
    // no virtual destructor!
}; …
Run Code Online (Sandbox Code Playgroud)

c++ destructor virtual-destructor c++11 rule-of-zero

9
推荐指数
1
解决办法
727
查看次数