小编方圆圆*_*方圆圆的帖子

const swap() 函数的用途是什么?

在实现自定义tuple此处)时,我发现有一个swap()带有const参数的有线函数(cppreference):

template< class... Types >
constexpr void swap( const std::tuple<Types...>& lhs,
                     const std::tuple<Types...>& rhs ) noexcept(/* see below */);
Run Code Online (Sandbox Code Playgroud)

和一个 const 限定的swap()成员函数 ( cppreference ):

constexpr void swap( const tuple& other ) noexcept(/* see below */) const;
Run Code Online (Sandbox Code Playgroud)

const意味着该对象是只读的,但是要交换两个对象,它必须修改对象,这违反了性质const

那么,const swap() 函数的目的是什么?

c++ stdtuple

32
推荐指数
2
解决办法
1848
查看次数

std::variant 在 MSVC 和 gcc 中的行为不同

MSVC 19.28 拒绝以下代码,但 gcc 10.2 接受并输出 true false

#include <iostream>
#include <variant>

int main()
{
    std::variant<long long, double> v{ 0 };
    std::cout << std::boolalpha << std::holds_alternative<long long>(v) << ' ' << std::holds_alternative<double>(v) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

根据cppreference

  1. 转换构造函数。如果同时对作用域中的每个from存在虚函数的重载,则构造一个包含替代类型的变体,该变体T_j将通过重载决议为表达式选择,除了:仅当声明对某些人有效时才考虑重载发明变量;直接初始化包含的值,就像通过从 直接非列表初始化一样。F(std::forward<T>(t))F(T_i)T_iTypes...F(T_i)T_i x[] = { std::forward<T>(t) };xstd::forward<T>(t)

和这个问题被转换成的哪个功能F(long long)F(double)选择agianst参数1由超负荷的分辨率。

转换intlong long整数转换(假设sizeof(long long)大于sizeof(int)),转换intdouble浮点整数转换,两者的排名都不高于另一个。所以调用是模棱两可的,程序格式不正确。

MSVC 确实像我预期的那样拒绝了代码,但令我惊讶的是,gcc …

c++ std-variant

13
推荐指数
1
解决办法
203
查看次数

为什么可执行文件被称为“图像文件”?

我正在阅读PE格式的文档。在文档中,“图像”一词多次出现,并且似乎总是与“可执行文件”一词一起出现。然而,它并没有解释为什么“可执行文件”被称为“图像文件”。

维基百科上有一个页面条目列表,其中几个术语包含“图像”,例如“磁盘映像”,“ISO映像”,甚至是“可执行文件”的链接,但它仍然没有解释“图像”的含义这样的背景。

经过谷歌搜索,我发现这个网站对“图像”给出了合理的解释:

(1) 在计算机科学中,图像是存储在第二个存储设备上的存储设备(例如硬盘驱动器或 CD-ROM)内容的精确副本。另请参阅磁盘映像。

那么,假设“ISO 映像”是光盘内容的精确复制品,那么“可执行映像”是什么呢?为什么可执行文件被称为“图像文件”?

binary executable executable-format

9
推荐指数
1
解决办法
1957
查看次数

为什么 MSVC 在结构化绑定中发现不合格的 get() ?

考虑以下代码:

#include <utility>
#include <type_traits>
#include <cstddef>
#include <iostream>

template <typename>
struct A
{
    void get() {}    // #1
};

template <typename ...Ts>
struct B : A<Ts>... {};

template <typename ...Ts>
struct std::tuple_size<B<Ts...>> : std::integral_constant<std::size_t, 2> {};

template <std::size_t I, typename ...Ts>
struct std::tuple_element<I, B<Ts...>>
{
    using type = int;
};

template <std::size_t I, typename ...Ts>
constexpr int get(B<Ts...>)    // #2
{
    return 2;
}

int main()
{
    B<double, long long> b;
    auto [x, y] = b;
    std::cout << x …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++17 structured-bindings

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