abseil / abseil/abseil-cpp

[Bug]: `flat_hash_map` incorrectly reports copyability

Open
#1,862 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
18.1k
Forks
3.2k
Avg merge
20h 36m
Merged PRs (30d)
1

Description

### 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.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.