小编Mit*_*iya的帖子

std :: unordered_map :: insert的重载

你能教我两者吗?

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&).

c++ c++11

15
推荐指数
1
解决办法
1608
查看次数

引用类型和odr使用的模板非类型参数

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的模式是错误的.

我的理解是否正确?

c++ boost language-lawyer

14
推荐指数
2
解决办法
174
查看次数

friend类声明和using指令

以下示例是否格式正确?

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++ namespaces using-directives friend name-lookup

13
推荐指数
2
解决办法
311
查看次数

为什么C++标准没有提到__STDC_IEC_559__?

根据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++ c++11

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

使用指令的行为

我对使用指令感到困惑.

根据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)

c++

8
推荐指数
1
解决办法
173
查看次数