Dav*_*ets 34 c++ constructor c++17
从第 12 行删除const可以防止该类What在编译期间被实例化。What无论声明中的常量如何,我都不希望被实例化。这在 clang、gcc 和 MSVC 之间是一致的,所以我认为它是标准的。标记构造函数explicit也不会阻止实例化。我在这里不明白什么?为什么常量会产生影响?
template <typename T> constexpr bool just_false() { return false; }
template<typename T>
class What {
static_assert(just_false<T>(), "Why was this class instantiated?");
};
struct The {};
struct Heck {
Heck(The) {}
Heck(const What<int>&); // Removing 'const' from this line stops 'What<int>' from being instantiated
};
int main() {
The the;
Heck{the};
}
Run Code Online (Sandbox Code Playgroud)
该just_false咒语只是为了防止静态断言始终触发,无论实例化如何。
编译器浏览器链接:https ://godbolt.org/z/8cETcfss5
Hol*_*Cat 33
如果const存在,并且What<int>恰好有一个构造函数采用The,则允许Heck(const What<int> &)使用(因为 const 引用可以绑定到由此类构造函数生成的临时值)。检查 的构造函数What<int>需要实例化What<int>模板。
如果没有,则不可能调用makeconst的实现,因此实例化它是没有意义的。What<int>Heck(What<int> &);
但似乎无论构造函数What<int>是什么,Heck(The)重载都会优先,所以严格来说,在这种特定情况下,这种实例化似乎是不必要的。
如果What有一个诸如 的构造函数What::What(The),则隐式转换Heck(What(the))对于 有效Heck::Heck(const What&),但对于 无效Heck::Heck(What&)。
在调用的重载解析期间Heck(the),对可行函数的搜索消除了Heck::Heck(What&)但没有消除Heck::Heck(const What&),这会继续到对最佳可行函数的搜索,这需要实例化What。
| 归档时间: |
|
| 查看次数: |
3748 次 |
| 最近记录: |