-
Notifications
You must be signed in to change notification settings - Fork 63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
6.46的答案不对吧? #22
Comments
应该是 NO,这么严重的错误,竟然一直都没人发现。。。 😓 感谢你指出,如果能直接发一个 Pull Request 来 fix 这个错误就更好了~ 😋 |
另外,我考虑了一下,如果直接用 #include <iostream>
#include <string.h>
constexpr bool isShorter(const char* str1, const char* str2)
{
return strlen(str1) < strlen(str2);
}
int main()
{
std::cout << std::boolalpha << isShorter("hello", "pezy") << std::endl;
std::cout << std::boolalpha << isShorter("hello", "Xsimplify") << std::endl;
} 输出:
FYI |
另外一种方式,最大程度的保留 #include <iostream>
#include <string>
class ConstString {
const char *s;
const int n;
public:
template<std::size_t N>
constexpr ConstString(const char(&a)[N]) : s(a), n(N-1) {}
constexpr char operator[](int i) { return ( i<0 || i>=n ? throw "error: out_of_range" : s[i]); }
constexpr int size() { return n; }
constexpr const char* c_str() { return s; }
operator std::string() const { return std::string(s, n); }
};
constexpr bool isShorter(const ConstString& str1, const ConstString& str2)
{
return str1.size() < str2.size();
}
int main()
{
ConstString str1("hello");
ConstString str2("Xsimplify");
std::cout << std::boolalpha << isShorter(str1, str2) << std::endl;
} reference: constexpr specifier |
谢谢解答,好效率~~ |
看了回复的代码,诸多不懂,constexpr不能修饰std::string想都没想,其实string的概念都模模糊糊。。。 |
@Xsimplify 个人认为,学 C++ 的方法很简单,但就难坚持。因为很复杂,也可能会很枯燥。
总的说,就上述三点。有 C 的基础很好,但要记住 C 和 C++ 是完全不同的两种语言,不要混着用。如果想更快的锻炼自己,可以多来这里回答回答问题。或是看书有不明白的地方,习题有迷惑的地方,在这里问。不出意外的话,12 小时之内,应该有人能帮你看看的。 💯 加油~ |
@pezy |
@Xsimplify 大部分同意@pezy 。就一点:CP5足够了,除非职业需要,否则不要看effective系列。 C++的学习意义很大程度上是对CS各个方向的延伸,诸如算法、操作系统、编译、CG、CV什么的。这些延伸比C++本身更重要、也更有意义。effective系列书籍,都是散点式不成体系的东西,仅仅是狭隘的就C++谈C++,一旦离开C++的工程语境,基本没多大用了。也就对C++项目有点儿意义,对个人成长来说纯属瞎耽误功夫。 差不多的精力,四个不同的分配方案: 方案1,顶多受益几个C++项目; |
我觉得虽然答案是no,但这个解释不对:
因为isShorter函数中形参是字面值(第59页说字面值包含算术符号、引用、指针,而改形参是一个string类型引用而不是string类型变量),下面是我的测试代码:
上面的代码能够测试通过,显然不是参数的问题。之后将上面代码中的return语句替换,得到下面代码:
编译就不通过了,而且错误点也出现在了size()这个地方,错误提示是“error, call to non-constexpr function”——size()是一个非constexpr函数。在下面的代码中我特意在constexpr函数中return一个non-constexpr函数:
发现还是会提示”error, call to non-constexpr function“,说明constexpr函数中调用的函数也必须是constexpr函数。 |
@lookfiresu123 你是对的,谢谢 |
为什么我这么写毫无警告就通过了编译?
|
编译器问题,在clang++3.6下编译是能通过的,但在g++4.9下编译会出现
clang++3.6:
编译阶段产生汇编代码,而上面的汇编代码中指出调用 |
constexpr int test(const string &s) {
return 12;
}
int main() {
int a[test("test")];
return 0;
} The code above produced a warning related to variable length arrays. Is this behavior related to the type conversion between |
isShorter函数不能定义成constexpr函数吧?isShorter函数返回值要调用size函数,编译时不能确定结果吧,测试了下不行。。。
答案不该是YES 应该是NO吧?
The text was updated successfully, but these errors were encountered: