abseil / abseil/abseil-cpp

[Bug]: `flat_hash_map` incorrectly reports copyability

未关闭
#1,862 2 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
C++
星标
18.1k
派生
3.2k
平均合并
20 小时 36 分钟
30 天内合并 PR
1

描述

### Describe the issue

`std::is_copy_constructible_v>` is `true` even when `std::is_copy_constructible_v` is `false`.

### Steps to reproduce the problem

https://godbolt.org/z/M7M9bqG5c

### What version of Abseil are you using?

20250121.0

### What operating system and version are you using?

Tested on Ubuntu, MacOS.

### What compiler and version are you using?

Tested on both clang and gcc

### What build system are you using?

bazel 8.1.1

### Additional context

Being sfinae friendly here is pretty important because standard library containers expect it. In my case, I had a `std::vector>` where `B` was a wrapper around an `absl::flat_hash_map`. Calls to `emplace_back`, which was very confusing.

The workaround is to explicitly declare the copy/move constructors explicitly for my wrapper as delete/default respectively so the trait doesn't dig into the implementation.

FWIW, `std::unordered_map` seems to have the same problem in both libc++ and libstdc++. I don't know of anything in the standard that requires this behavior. Also because it's detectable, a change can in theory constitute an ABI break, so that's fun. I know Abseil doesn't care, but there's an interesting question about divergence from standard behavior here.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。