在C++ 11中,我们有了用于初始化类的新语法,它为我们提供了如何初始化变量的大量可能性.
{ // Example 1
int b(1);
int a{1};
int c = 1;
int d = {1};
}
{ // Example 2
std::complex<double> b(3,4);
std::complex<double> a{3,4};
std::complex<double> c = {3,4};
auto d = std::complex<double>(3,4);
auto e = std::complex<double>{3,4};
}
{ // Example 3
std::string a(3,'x');
std::string b{3,'x'}; // oops
}
{ // Example 4
std::function<int(int,int)> a(std::plus<int>());
std::function<int(int,int)> b{std::plus<int>()};
}
{ // Example 5
std::unique_ptr<int> a(new int(5));
std::unique_ptr<int> b{new int(5)};
}
{ // Example 6
std::locale::global(std::locale("")); // copied from 22.4.8.3 …Run Code Online (Sandbox Code Playgroud) 在并发库GHC.Conc中有一个名为的函数numCapabilities.它的类型是numCapabilities :: Int,它实际上返回一些你通过命令行标志传递的数字(例如,5如果选项是+RTS -N 5).
但是,getArgs(type IO [String]:)基本上相同(它返回未解析的非运行时参数)但不是纯函数.
如果唯一借口是numCapabilities往往需要在纯代码,以什么方式不其他命令行选项不能在纯代码需要?
我缺少什么或者是numCapabilities设计缺陷还是我允许写下面的怪物?
myGetArgs = unsafePerformIO getArgs
Run Code Online (Sandbox Code Playgroud) 我有一个包含一些数据的文件.这些数据永远不会改变,我想让它在IO monad之外可用.我怎样才能做到这一点?
示例(请注意,这只是一个示例,我的数据不可计算):
primes.txt:
2 3 5 7 13
code.hs:
primes :: [Int]
primes = map read . words . unsafePerformIO . readFile $ "primes.txt"
Run Code Online (Sandbox Code Playgroud)
这是"合法"使用unsafePerformIO吗?还有替代品吗?
什么C/C++ - 标准保证a的最小有效小数位double?
C++标准实际上在§18.3.2.4/10的脚注中说,这相当于DBL_DIGC标准中的定义.但是我找不到关于C标准中最小值的任何信息.
那么,下列之一的最小值是多少?
std::numeric_limits<double>::digits10DBL_MANT_DIG 编辑:不, DBL_DIG我想为我的标题中的每个类生成唯一的数字,在我的案例中为素数,但是假设这应该只是连续的数字,即1,2,3,4等.
当然我可以硬编码:
struct A { enum { ID = 1; }; };
struct B { enum { ID = 2; }; };
struct C { enum { ID = 3; }; };
struct D { enum { ID = 4; }; };
Run Code Online (Sandbox Code Playgroud)
这非常容易出错,因为实际上类不是那么小,如果我在中间添加一个新类,如果我不想完全忽略ID的概述,我必须更改以下所有数字.
我希望我能做到以下几点:
struct A { enum { ID = get_next_int(); }; };
struct B { enum { ID = get_next_int(); }; };
struct C { enum { ID = get_next_int(); }; };
struct D { enum { ID …Run Code Online (Sandbox Code Playgroud) 我想知道什么__cerb的意思libstdc++的g++,我发现,这似乎是一个简短的名称cerberos作为官方C++标准文档命名.
§22.3.1/ 3:
[示例:iostream
operator<<可能实现为:Run Code Online (Sandbox Code Playgroud)template <class charT, class traits> basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>& s, Date d) { // !!!!!!!!!! typename basic_ostream<charT,traits>::sentry cerberos(s); // <--- !! HERE !! // !!!!!!!!!! if (cerberos) { ios_base::iostate err = ios_base::iostate::goodbit; tm tmbuf; d.extract(tmbuf); use_facet<time_put<charT,ostreambuf_iterator<charT,traits> > >( s.getloc()).put(s, s, s.fill(), err, &tmbuf, ’x’); s.setstate(err); // might throw } return s; }- 结束例子]
为什么sentry调用iostream 对象cerberos,cerberos实际意味着什么?
我只是用一个很好的答案来阅读这个问题:什么时候在null实例上调用成员函数会导致未定义的行为?
基本上,下面的代码是未定义的行为吗?
struct foo { static void bar() { } };
foo *p = nullptr;
p->bar();
Run Code Online (Sandbox Code Playgroud)
根据链接的帖子,这可以用不同的方式解释,一个是UB,一个不是.
在C++ 0x中,从n3126开始,模糊性仍然存在
这仍然适用于最终的C++ 11吗?
c++ ×5
c++11 ×3
haskell ×2
c ×1
compile-time ×1
iostream ×1
naming ×1
null-pointer ×1
side-effects ×1