你能教我两者吗?
std::unordered_map::insert(const value_type&)
Run Code Online (Sandbox Code Playgroud)
和
template<class P> std::unordered_map::insert(P&&)
Run Code Online (Sandbox Code Playgroud)
存在于标准中?
我认为这insert(P&&)
可以作为insert(const value_type&)
.
v
下面的示例代码中的变量是否使用了odr?
extern void* v;
template<void*&>
void f() {}
int main()
{
f<v>();
}
Run Code Online (Sandbox Code Playgroud)
我在Boost ML中发现了这种模式.
比照 http://lists.boost.org/Archives/boost/2011/04/180082.php
它表示boost::enabler
永远不会定义,但如果提供选项,clang会将其拒绝为链接错误-g
.
比照 http://melpon.org/wandbox/permlink/nF45k7un3rFb175z
上面的示例代码是Boost ML代码的缩减版本,clang也拒绝它.
比照 http://melpon.org/wandbox/permlink/ZwxaygXgUhbi1Cbr
我认为(但我不确定)参考类型的模板非类型参数是odr使用的,即使它们未在模板体中引用,因此Boost ML的模式是错误的.
我的理解是否正确?
以下示例是否格式正确?
namespace N {
class A;
}
using namespace N;
class B {
int i;
friend class A;
};
namespace N {
class A {
B m;
int get() { return m.i; }
};
}
Run Code Online (Sandbox Code Playgroud)
这个例子使用Clang 3.5成功编译,但是使用g ++ 4.8.1失败了以下内容:
main.cpp: In member function ‘int N::A::get()’:
main.cpp:7:9: error: ‘int B::i’ is private
int i;
^
main.cpp:14:30: error: within this context
int get() { return m.i; }
^
Run Code Online (Sandbox Code Playgroud)
C++ 11标准§7.3.1.2p3说,
如果
friend
声明中的名称既不是限定名也不是模板标识,并且声明是函数或详细类型说明符,则确定实体是否先前已声明的查找不应考虑最内层封闭命名空间之外的任何范围.
例如,class A
不是最内层封闭命名空间 …
根据C++ 11标准[c.math],<cmath>
标题与标准C库标题相同<math.h>
.
(当然,有几个区别,---命名空间,重载等---但这些可以在这里忽略.)
并且根据C99标准附录F,"定义的实现__STDC_IEC_559__
应符合"附件中的规范F.
防爆.在atan2
可能引起域错误,如果两个参数都是零,但它不能如__STDC_IEC_559__
定义.
在C99中,许多行为还取决于是否__STDC_IEC_559__
定义.
但是,似乎__STDC_IEC_559__
在C++ 11标准中没有提到任何地方.
如果是这样,C++实现是否符合附件F中的规范?
我认为这std::numeric_limits<T>::is_iec559()
是一种替代品,但似乎只提到了类型.
我对使用指令感到困惑.
根据C++ 11标准§7.3.4p.3,
using-directive不会将任何成员添加到它出现的声明区域.
此外,C++ 11标准§7.3.4不处理限定名称查找.
因此,IMHO using-directive对限定名称查找没有影响.
例如,我认为以下示例代码应该导致编译错误.
#include <iostream>
namespace A {
namespace B {
int i = 1;
}
using namespace B;
}
int main()
{
std::cout << A::i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是gcc和clang都成功编译了这段代码.(http://melpon.org/wandbox/permlink/rXPjE5k12yMtlvMg)
此外,C++ 11标准§7.3.1.1表明,未命名的命名空间定义的行为就像它被替换为
inlineopt namespace unique { /* empty body */ } using namespace unique; namespace unique { namespace-body }
并显示以下示例(省略了不必要的部分).
namespace { int i; } // unique::i
namespace A {
namespace {
int i; // A::unique::i
}
}
using namespace …
Run Code Online (Sandbox Code Playgroud)