Да (str.empty() == (str == ""))
всегда* верен для std::string
. Но помните, что string
может содержать '\0'
символы. Таким образом даже при том, что выражение s == ""
может быть ложью, s.c_str()
может все еще возвратить пустую струну до. Например:
#include <string>
#include <iostream>
using namespace std;
void test( const string & s ) {
bool bempty = s.empty();
bool beq = std::operator==(s, ""); // avoid global namespace operator==
const char * res = (bempty == beq ) ? "PASS" : "FAIL";
const char * isempty = bempty ? " empty " : "NOT empty ";
const char * iseq = beq ? " == \"\"" : "NOT == \"\"";
cout << res << " size=" << s.size();
cout << " c_str=\"" << s.c_str() << "\" ";
cout << isempty << iseq << endl;
}
int main() {
string s; test(s); // PASS size=0 c_str="" empty == ""
s.push_back('\0'); test(s); // PASS size=1 c_str="" NOT empty NOT == ""
s.push_back('x'); test(s); // PASS size=2 c_str="" NOT empty NOT == ""
s.push_back('\0'); test(s); // PASS size=3 c_str="" NOT empty NOT == ""
s.push_back('y'); test(s); // PASS size=4 c_str="" NOT empty NOT == ""
return 0;
}
** запрет перегрузки operator==
в глобальном пространстве имен, как другие упомянули*
GetFileInformationByHandle заполняет структуру BY_HANDLE_FILE_INFORMATION , которая имеет поле dwFileAttributes
, где биты устанавливаются с информацией об атрибутах файла (подробности здесь ). В частности, посмотрите на бит маски ...:
FILE_ATTRIBUTE_REPARSE_POINT
1024 0x0400Файл или каталог, имеющий связанная точка повторной обработки или файл это символическая ссылка.
Согласно этот ответ на вопрос о переполнении стека Узнайте, является ли файл символической ссылкой в PowerShell , получив System.IO.FileAttributes для файл (через File.GetAttributes ), и тестирование для бита ReparsePoint работает. Если бит установлен, это символическая ссылка или точка соединения. Если нет, то это обычный файл (или жесткая ссылка).