aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorlaanwj <126646+laanwj@users.noreply.github.com>2022-06-01 13:29:25 +0200
committerlaanwj <126646+laanwj@users.noreply.github.com>2022-06-01 13:32:48 +0200
commitdd52f79a73eca18301db1569d517197160018dbb (patch)
tree4cd64424d6381e01268f8d2c82849044cd3eec70 /doc
parente157b98640c7cfb94cae7e0faca3bcffc2dde990 (diff)
parent52a797bfe5ced4329f2272be417c35730ec8839f (diff)
Merge bitcoin/bitcoin#24416: doc: Avoid ADL for function calls
52a797bfe5ced4329f2272be417c35730ec8839f doc: Avoid ADL for function calls (Hennadii Stepanov) Pull request description: It happened two times recently, when [ADL](https://en.cppreference.com/w/cpp/language/adl) popped up unexpectedly and brought some confusion: - https://github.com/bitcoin/bitcoin/pull/24338/files#r805989994 > Any idea why this even compiles? - https://www.erisian.com.au/bitcoin-core-dev/log-2022-02-18.html#l-51: > 2022-02-18T03:24:14 \<dongcarl\> Does anyone know why this compiles? https://github.com/dongcarl/bitcoin/commit/6d3d2caa3751f968f72d19fa84f001472fb26749 > 2022-02-18T03:24:14 \<dongcarl\> GetUTXOStatsWithHasher and MakeUTXOHasher are both in the `kernel::` namespace and I never added a `using` declaration on top... > 2022-02-18T03:25:53 \<sipa\> https://en.cppreference.com/w/cpp/language/adl ? Let's document our intention to avoid similar cases in the future. ACKs for top commit: laanwj: Anyhow, ACK 52a797bfe5ced4329f2272be417c35730ec8839f, there is no need to hold merge up on this, documenting it is a step forward. Tree-SHA512: f52688b5d8f6130302185206ec6ea4731b099a75294ea2d477901a52d6d58473e3427e658aea408c140c2824c37a0399ec7376aded2a91197895ea52d51f0018
Diffstat (limited to 'doc')
-rw-r--r--doc/developer-notes.md22
1 files changed, 22 insertions, 0 deletions
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index 3793fb3315..4843e61ee8 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -110,6 +110,28 @@ code.
- `nullptr` is preferred over `NULL` or `(void*)0`.
- `static_assert` is preferred over `assert` where possible. Generally; compile-time checking is preferred over run-time checking.
+For function calls a namespace should be specified explicitly, unless such functions have been declared within it.
+Otherwise, [argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl), also known as ADL, could be
+triggered that makes code harder to maintain and reason about:
+```c++
+#include <filesystem>
+
+namespace fs {
+class path : public std::filesystem::path
+{
+};
+// The intention is to disallow this function.
+bool exists(const fs::path& p) = delete;
+} // namespace fs
+
+int main()
+{
+ //fs::path p; // error
+ std::filesystem::path p; // compiled
+ exists(p); // ADL being used for unqualified name lookup
+}
+```
+
Block style example:
```c++
int g_count = 0;