language-design 相关问题

与编程语言的任何方面的设计相关的问题的标签。

为什么 void main() 没有标准化为 main 函数的有效签名?

为什么在 C++ 中将入口点的返回类型设置为 void 总是不被鼓励,后来被标准删除并被现代编译器禁止?为什么它被认为是不好的做法?...

回答 4 投票 0

为什么不允许调用main函数?

C++03 3.6.1.3:程序中不得使用 main 函数 (3.2)。 ... 我想知道为什么这条规则存在...是否有人知道任何系统/实现,如果 main 是

回答 3 投票 0

为什么 range::for_each 返回函数?

传统的 std::for_each 返回函数作为标准,仅要求 Function 根据 [alg.foreach] 满足 Cpp17MoveConstructible: 模板

回答 3 投票 0

在java中不使用类名静态访问.class对象

在java中,可以在不使用(换句话说,键入)类名的情况下访问类。一个例子 公共类示例{ /** * 非静态上下文,只能从...调用

回答 3 投票 0

C++ 标准委员会是否有意让 C++11 中的 unordered_map 破坏它插入的内容?

我刚刚浪费了三天的时间来追踪一个非常奇怪的错误,其中 unordered_map::insert() 破坏了您插入的变量。这种非常不明显的行为发生在最近的编译器中

回答 2 投票 0

为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

C++ 标准本身将 char、signed char 和 unsigned char 的大小定义为 1 个字节。我想知道为什么它也没有定义 sizeof(bool) ? C++03 标准 $5.3.3/1 说, 大小(c...

回答 4 投票 0

为什么没有内联变量? [重复]

C++ 中的 inline 关键字允许在标头中定义函数,以便编译器可以实际内联它们或仅保留函数的一份副本。这可以减少

回答 4 投票 0

为什么C++没有std::invocable_r概念?

C++20 添加了概念,标准库中包含了相当多的概念。一个概念特别引起了我的注意:std::invocable,它验证可以使用一组参数调用函子...

回答 1 投票 0

为什么*必须*delete[] 和delete 不同?

我很清楚,在C++中,delete[]与new[]的关系,delete与new的关系。这与 C++ 语法无关。我想知道删除 [] 被定义为与普通 del 不同的原因...

回答 2 投票 0

为什么我们不能在类中声明命名空间别名?

看起来不可能在类中声明命名空间别名;但是我们可以在函数级别这样做(使用 g++ 4.3.4 测试): 命名空间A { } C级 { 命名空间 N = A; // 错误:

回答 3 投票 0

为什么std::make_shared<T>不是std::shared_ptr<T>的静态函数,即std::shared_ptr<T>::make?

这是一个关于理解设计决策的问题,而不是对错误或缺陷的抱怨。 在C++标准库中,创建共享指针及其对象的函数是直函数...

回答 1 投票 0

区分递归下降解析器中的 Lambda 参数列表和分组表达式

我正在为我正在从事的项目编写一种小型脚本语言。我为它编写了一个简单的递归下降解析器(类似于 Crafting Interpreters 中的解析器)。我想添加对

回答 1 投票 0

为什么std::unordered_map的KeyEqual没有被它的operator==使用?

在下面的代码中,我为unordered_map定义了模板参数Hash和KeyEqual。我期望输出是 1 1 1 1 但实际上是 1 1 0 1。为什么会发生这种情况?是因为 std::

回答 1 投票 0

为什么函数模板不能部分特化?

我知道语言规范禁止函数模板的部分专业化。 我想知道为什么禁止这样做?它们没有用吗? 模板 我知道语言规范禁止函数模板的部分专业化。 我想知道为什么禁止这样做?它们没有用吗? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed! 据我所知,C++0x 中已更改。 我想这只是一个疏忽(考虑到你总是可以通过更详细的代码获得部分专业化效果,通过将函数放置为类的 static 成员)。 如果有的话,你可以查一下相关的DR(缺陷报告)。 编辑:检查这一点,我发现其他人也相信这一点,但没有人能够在标准草案中找到任何此类支持。 这个SO线程似乎表明C++0x不支持函数模板的部分特化。 编辑2:只是我所说的“将函数作为类的static成员”的意思的一个例子: #include <iostream> using namespace std; // template<typename T, typename U> void f() {} //allowed! // template<> void f<int, char>() {} //allowed! // template<typename T> void f<char, T>() {} //not allowed! // template<typename T> void f<T, int>() {} //not allowed! void say( char const s[] ) { std::cout << s << std::endl; } namespace detail { template< class T, class U > struct F { static void impl() { say( "1. primary template" ); } }; template<> struct F<int, char> { static void impl() { say( "2. <int, char> explicit specialization" ); } }; template< class T > struct F< char, T > { static void impl() { say( "3. <char, T> partial specialization" ); } }; template< class T > struct F< T, int > { static void impl() { say( "4. <T, int> partial specialization" ); } }; } // namespace detail template< class T, class U > void f() { detail::F<T, U>::impl(); } int main() { f<char const*, double>(); // 1 f<int, char>(); // 2 f<char, double>(); // 3 f<double, int>(); // 4 } 好吧,你确实不能进行部分函数/方法特化,但是你可以进行重载。 template <typename T, typename U> T fun(U pObj){...} // acts like partial specialization <T, int> AFAIK // (based on Modern C++ Design by Alexandrescu) template <typename T> T fun(int pObj){...} 是这样,但不知道是否让你满意。 一般来说,根本不建议专门化函数模板,因为重载会带来麻烦。这是来自 C/C++ 用户期刊的一篇好文章:http://www.gotw.ca/publications/mill17.htm 它包含对您问题的诚实回答: 一方面,你不能部分专业化它们——几乎只是因为语言说你不能。 由于您可以部分专业化类,因此可以使用函子: #include <iostream> template <typename dtype, int k> struct fun { int operator()() { return k; } }; template <typename dtype> struct fun <dtype, 0> { int operator()() { return 42; } }; int main ( int argc , char * argv[] ) { std::cout << fun<float, 5>()() << std::endl; std::cout << fun<float, 0>()() << std::endl; }

回答 4 投票 0

在LLVM中声明参数的字符串类型

如何在 LLVM C++ api 中声明字符串参数?例如,要声明双参数,我会这样做: argTypes.push_back(类型::getDoubleTy(*context)) 可以这样做吗...

回答 1 投票 0

为什么默认模板参数只允许在类模板上使用?

为什么默认模板参数只允许在类模板上使用?为什么我们不能在成员函数模板中定义默认类型?例如: 结构我的类{ 模板...

回答 5 投票 0

为什么默认情况下没有调整特征大小?

我定义了一个特征ReadTag,它包含一个可以返回Self的函数: 特征 ReadTag { // 错误[E0277]:编译时无法知道“Self”类型值的大小 fn read_out(bu...

回答 1 投票 0

为什么局部函数定义在 C++ 中是非法的?

令我感到奇怪的是,局部函数定义是非法的。就目前情况而言,我怀疑它太难实现,并且删除可能是潜在功能的内容(如

回答 1 投票 0

考虑到 C++23 对 constexpr 的放宽,constexpr 不能成为默认值吗?

关键字 constexpr 在引入 C++11 标准时对其函数施加了相当严格的限制。 C++14 和 C++20 放宽了这些限制(最值得注意): C++14 等...

回答 1 投票 0

命名空间 std 中不可寻址函数的基本原理是什么?

[namespace.std] 不允许获取 std 命名空间中大多数函数的地址或引用。这是一个很大的陷阱,因为将标准库函数作为

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.