我在新的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,我想我理解了这些.但:
\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以相同的方式处理另一个.
你怎么看?
从阅读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?我想有一些格式的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*.html文件磁盘并让它less在自己的题外话处理(看到html扩展并对其进行操作?)当我写一个简单的算术表达式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++ - 模板 - 不是专家,请注意.使用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++ 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.
我现在的问题是:
Lock这里的模拟)时,这个Singleton模式的安全C++ 11实现现在怎么样?我在几个地方发现了应该如何使用诺言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?我正在玩新explicit的铸造操作员.如果你写的东西像
struct Data {
explicit operator string();
};
Run Code Online (Sandbox Code Playgroud)
不可能意外转换Data为string.所述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) 我和其他人有同样的问题:
*.la由libtool生成的文件(例如),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) 我发现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)