C++: Miért nem kell minden függvénynél megadni az std:: névteret?
Ez a kód:
#include <cstdlib>
#include <ctime>
#include <iostream>
int main()
{
srand((unsigned) time(0));
std::cout << rand() % 6;
}
A kérdésem arra vonatkozik, hogy a srand() és a time() előtt miért nem kell megadni az std:: névteret?
Azt értem, hogy a rand()-nál miért nem kell, ott
operator<<(std::cout, rand() % 6);
lesz belőle, így működik az ADL. De az első sornál nem.










"operator<<(std::cout, rand() % 6);"
Itt az ADL nem azt jelenti, hogy a rand-nál nem kell, hanem azt, hogy az operátornál nem kell kiírni. Ugye a globális névtérben nincs operator<<(std::ostream&, int), azonban mivel egyik argumentumnak az std::cout van megadva így megfogja találni az std::operator<<(std::ostream&, int) függvényt.
A rand és az srand C-s függvény, ugyan amikor a <cstdlib> headert includolod akkor lesz std::rand és std::srand is, de a szabvány szerint megvan engedve, hogy ezeket a függvényeket beemelje a globális névtérbe, ezért tudod std nélkül is használni.
Külön megjegyzés a rand/sranddal kapcsolatban a cppreference oldalról (ha nem megy az angol a google fordító változat is érhető, persze tanulásnál nincs semmi gond ennek használatával, de jó tudni):
"There are no guarantees as to the quality of the random sequence produced. In the past, some implementations of rand() have had serious shortcomings in the randomness, distribution and period of the sequence produced (in one well-known example, the low-order bit simply alternated between 1 and 0 between calls).
rand() is not recommended for serious random-number generation needs. It is recommended to use C++11's random number generation facilities to replace rand(). (since C++11)"





#3: Köszönöm, ezen a nyomon el lehet indulni:
"A rand és az srand C-s függvény, ugyan amikor a <cstdlib> headert includolod akkor lesz std::rand és std::srand is, de a szabvány szerint megvan engedve, hogy ezeket a függvényeket beemelje a globális névtérbe, ezért tudod std nélkül is használni."
Ezt egyébként honnan lehet tudni? A cppreference is csak mint std::rand hivatkozik ezekre a függvényekre és itt sem találtam erre utalást:
Köszönöm az ADL-lel kapcsolatos kijavítást is, azt valóban rosszul értettem.










"[Example: The header <cstdlib> assuredly provides its declarations and definitions within the namespace std. It may also provide these names within the global namespace. The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in the C Standard. It may also provide these names within the namespace std. — end example ]"
Forrás: [link] | 1312. oldal, 3-4 bekezdés.
Szóval amikor a cstdlib-et includolod nem kötelező, hogy elérhető legyen a globális névtérből, így attól függően, hogy neked az adott OP rendszeren, adott fordítóval elérhető std nélkül, nem garantálja, hogy minden platformon így lesz. Ha pedig a sima C-s headert (stdlib.h) includolod akkor pont fordítva van, globális névtérben biztos lesz, az std-ben opcionális.
Köszönöm, így már világos.
Egyébként egy angol nyelvű tutorial alapján haladok, de vannak benne ilyen megmagyarázatlanul hagyott dolgok. Van amire találtam máshol magyarázatot, de ez így sehol nem volt leírva, szóval nagyon hasznosak voltak a válaszaid.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!