小编boy*_*ycy的帖子

没有'右值引用*this'功能的变通方法

我有一个围绕可移动对象的代理容器类,并希望代理能够隐式地产生对底层对象的rvalue引用,但仅在代理本身被移动时.

我相信我将能够按照提议n2439 "将移动语义扩展到*this"来实现此行为,但它尚未在gcc的发行版中提供,并且暂时不会出现.

下面的代码是我最终的目标,但目前无法实现.在此功能可用之前,是否有任何等效的解决方法?

template< class T >
struct movable_proxy {
    operator T&&() && {
        return std::move(value);
    }

    operator const T&() const& {
        return value;
    }

private:
    T value;
};
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference move-semantics c++11

67
推荐指数
1
解决办法
2784
查看次数

为什么模板参数包不能在函数调用中推导出多个类型参数?

我有一个类型参数和参数包模板的类,并对这种类型的类型推导感到困惑; 在编写输出流操作符时,我发现参数包on operator<<不会与模板类的类型和包参数匹配:

#include <iostream>

template<class T, class... Ts>
struct foo
{ /* ... */ };

template< class... Ts >
std::ostream& operator<<( std::ostream& os, const foo<Ts...>& )
{
  return os << 42;
}


int main()
{
  std::cout << foo<int>();
}
Run Code Online (Sandbox Code Playgroud)

这无法在gcc-4.7.2和clang-3.0上编译,所以我想我在这里误解了规则.

gcc说(第16行是输出流调用):

t.cpp:16:28: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/iostream:40:0,
                 from t.cpp:1:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/ostream:600:5: error:   initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

19
推荐指数
1
解决办法
2020
查看次数

我可以创建一个没有底层容器对象的空范围(迭代器对)吗?

我有一个类似于以下的类:

struct Config
{
   using BindingContainer = std::map<ID, std::vector<Binding>>;
   using BindingIterator  = BindingContainer::mapped_type::const_iterator;

   boost::iterator_range<BindingIterator> bindings(ID id) const;
private:
   BindingContainer m_bindings;
};
Run Code Online (Sandbox Code Playgroud)

由于ID传递给bindings()可能不存在,我需要能够在返回类型域中表示"无绑定"值.

我不需要区分未知IDID映射到空vector,所以我希望能够通过上面的接口实现这一点,并返回一个带有默认构造迭代器的空范围.不幸的是,尽管a ForwardIteratorDefaultConstructible[C++ 11 24.2.5/1],比较单个迭代器的结果是未定义的[24.2.1/5],所以没有容器似乎这是不可能的.

我可以将界面更改为例如换iterator_range入a boost::optional,或者返回向量值; 前者对调用者来说更笨拙,后者有不合需要的复制开销.

另一种选择是保持静态分配的空向量并返回其迭代器.在这种情况下,开销不会有问题,但如果可以,我想避免它.

调整map迭代器以产生可比较的默认构造迭代器是一种可能,虽然看起来过于复杂......

这里是否有任何其他选项可以支持在没有底层容器时返回空范围?

(顺便提一下,我肯定有一段时间我读了一篇关于在没有容器对象的情况下为标准容器类型生成空范围的工作文章或文章,但现在找不到任何东西.)

(注意我仅限于C++ 11的功能,但是如果有任何不同的方法需要以后的功能,我会感兴趣.)

c++ boost c++11

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

如何在标头中使用未命名的命名空间会导致ODR违规?

在Google C++样式指南中,命名空间部分指出" 在头文件中使用未命名的命名空间很容易导致违反C++ One Definition Rule(ODR). "

我理解为什么不在实现文件中使用未命名的命名空间可能会导致ODR违规,但不能在标头中使用它们.这怎么会导致违规?

c++ one-definition-rule unnamed-namespace

6
推荐指数
1
解决办法
696
查看次数

2个受信任网络之间的持久,未加密的Internet连接有多脆弱?

方案:2个网络设备,每个在单独的专用LAN上。局域网通过公共互联网连接。

网络A上的设备正在套接字上侦听;网络防火墙具有NAT端口转发设置,可以从网络B的端口范围进行外部访问。

网络B上的设备建立到网络A的传出连接以连接到侦听套接字。

短期连接的脆弱性是否存在于数据传输中,然后在完成时被断开(例如几秒钟),以及采用保持活动机制并在断开时重新连接(小时,天等)的持久连接是否存在差异?

实际建立连接的安全性不是我的问题。

networking network-programming

2
推荐指数
1
解决办法
304
查看次数

使用`operator!=()`实现`operator ==()`是否更有效?反之亦然?

在我看来,对于任何复合对象来说,实现它是低效operator!=operator==.对于要与N子对象进行比较的对象,operator==必须始终执行这些比较中的每一个:当且仅当每个子对象相等时,2个对象相等.(忽略此讨论中不相关的子对象.)

相比之下operator!=,只有在找到不匹配时才检查子对象就足够了.因此,在复合情况下使operator!=委托operator==变得低效,因为它在每种情况下都会产生N次比较,而不仅仅是最坏的情况.

这是张贴由开始的超长评论讨论后一个新的问题这条评论.另一位意见提供者说:

operator== 并不总是需要进行N次比较,在最坏的情况下只需要进行N次比较,这至少是除了最后一个子对象之外的所有子对象

我看不出那可能是怎么回事......我错过了什么?

这当然比纯粹的C++更为通用,但由于讨论是针对我的,所以我保留了相同的标签.

c++

-1
推荐指数
1
解决办法
79
查看次数